2016-10-26 2 views
1

мне интересно, если это возможно, чтобы сделать что-то подобное в Javascript:Javascript: функции как параметры, возможности

one(plus(nine())); // returns 10 

Это так кажется, но я не знаю, как я бы передать значение one() к функции plus().

+0

Вы пробовали? Что случилось? – ssube

+3

Для этого тривиального примера я мог бы просто иметь «one = plus = nine = function() {return 10; } '. Вам нужна гораздо более полная спецификация того, что есть и не разрешено реализовать это. – Eric

+0

@ Эрик. Какое имя метода OP, похоже, спрашивает? – evolutionxbox

ответ

13

Один такой выбор будет определять (с помощью arrow functions для лаконичности):

// creates a function that either returns the number, or forwards the number 
// as an argument to the provided function 
// createNumber(10)() == 10 
// createNumber(9)(Math.sqrt) == 3 
var createNumber = value => f => f ? f(value) : value; 

var one = createNumber(1); 
var nine = createNumber(9); 

// A very basic curryed implementation of addition 
// plus(1)(2) == 3 
var plus = a => b => a + b; 

Что дает ваше требуемое поведение

> one(plus(nine()) 
10 

И целую кучу столь же ошибочными, но правильно поведение

> nine() 
9 
> nine(plus(one())) 
10 
> plus(nine())(one()) 
10 
> nine(plus)(one()) 
10 

: См Vincenzo Maggio's answer для перевода в стандартные анонимные функции

+1

Теперь это одно из решений. Очень хорошо. –

+0

Это потрясающе. Самым большим недостатком, похоже, является создание функции для каждого используемого числа. – evolutionxbox

+1

@evolutionxbox: Ну, вам нужно создать что-то для каждого используемого номера, и поскольку OP требует, чтобы он был вызываемым, я не вижу другого пути. – Eric

-1

Каждая функция в JavaScript является объектом Function.

В JavaScript функции являются первоклассными объектами, поскольку они могут иметь свойства и методы, как и любой другой объект. Что отличает их от других объектов, так это то, что функции можно вызвать.

Таким образом, как объекты могут передаваться от одной функции к другой, вы можете передать функцию ссылки.

Например:

function add(var a, var b){ 
    return a+b; 
} 

function multiply(var a, var b){ 
    return a*b; 
} 

var compute(var a, var b, var operation){ 

    console.log(operation(a,b)); 

} 

После добавления paranthesis (), функция не вызывается немедленно, и он больше не является ссылкой. Если вам присваивается возвращаемое значение выполнения функции, оно назначается переменной LHS.

Например: var result = compute(10,20,add); // 20

в противном случае он просто теряется с фрейме стека функции, где называется вычислить.

0

Возможно, определенно.

Однако вам нужно использовать какую-то искривленную логику, которая может быть не слишком чистой, и у вас будет абсурдно трудное время, что делает ее действительно полезной.

Одним из возможного практического решения этой конкретной проблемы:

nine = function(c) { 
 

 
    if (typeof c === "object" && typeof c.method !== "undefined") { 
 
    return c.value + 9; 
 
    } else { 
 
    return 9; 
 
    } 
 

 
}; 
 

 
plus = function(a) { 
 
    return { 
 
    value: a, 
 
    method: "+" 
 
    } 
 
}; 
 

 
one = function(c) { 
 

 
    if (typeof c === "object" && typeof c.method !== "undefined") { 
 
    return c.value + 1; 
 
    } else { 
 
    return 1; 
 
    } 
 

 
}; 
 

 
console.log(one(plus(nine()))) // -> 10 
 
console.log(nine(plus(one()))) // -> 10 
 
console.log(nine())    // -> 9 
 
console.log(one())     // -> 1

2

Да, Javascript является прототип/функциональный язык может создавать новые функции и передать их вокруг

//Returns a function that called without parameters extract the internal number 
function number(num = null) { 
    return function(op) { 
    if (op == null) return num 
     else return op(num) 
    } 
} 

function plus(n1) { 
    return function(n2) { 
    return n2 + n1 
    } 
} 

var one = number(1) 
var nine = number(9) 

document.write(one(plus(nine()))) 

Я сохранил this fiddle, чтобы вы могли поиграть, если вам нужно.

+2

Это то же самое, что и мой ответ, но я считаю, что перевод функций стрелок удобен, поэтому ** + 1 ** :) – Eric

+0

Ну, я даже не знал, что они существуют. Я написал свой ответ, не увидев твоего, извините, если он казался клонированным. –

Смежные вопросы