мне интересно, если это возможно, чтобы сделать что-то подобное в Javascript:Javascript: функции как параметры, возможности
one(plus(nine())); // returns 10
Это так кажется, но я не знаю, как я бы передать значение one() к функции plus().
мне интересно, если это возможно, чтобы сделать что-то подобное в Javascript:Javascript: функции как параметры, возможности
one(plus(nine())); // returns 10
Это так кажется, но я не знаю, как я бы передать значение one() к функции plus().
Один такой выбор будет определять (с помощью 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 для перевода в стандартные анонимные функции
Теперь это одно из решений. Очень хорошо. –
Это потрясающе. Самым большим недостатком, похоже, является создание функции для каждого используемого числа. – evolutionxbox
@evolutionxbox: Ну, вам нужно создать что-то для каждого используемого номера, и поскольку OP требует, чтобы он был вызываемым, я не вижу другого пути. – Eric
Каждая функция в 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
в противном случае он просто теряется с фрейме стека функции, где называется вычислить.
Возможно, определенно.
Однако вам нужно использовать какую-то искривленную логику, которая может быть не слишком чистой, и у вас будет абсурдно трудное время, что делает ее действительно полезной.
Одним из возможного практического решения этой конкретной проблемы:
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
Да, 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, чтобы вы могли поиграть, если вам нужно.
Это то же самое, что и мой ответ, но я считаю, что перевод функций стрелок удобен, поэтому ** + 1 ** :) – Eric
Ну, я даже не знал, что они существуют. Я написал свой ответ, не увидев твоего, извините, если он казался клонированным. –
Вы пробовали? Что случилось? – ssube
Для этого тривиального примера я мог бы просто иметь «one = plus = nine = function() {return 10; } '. Вам нужна гораздо более полная спецификация того, что есть и не разрешено реализовать это. – Eric
@ Эрик. Какое имя метода OP, похоже, спрашивает? – evolutionxbox