我想知道是否可以在Javascript中执行类似的操作:
one(plus(nine())); // returns 10
似乎如此,但我不确定如何将one()的值传递给plus()函数。
答案 0 :(得分:13)
一个这样的选择是定义(使用arrow functions简洁 1 ):
// 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
1 :有关标准匿名函数的翻译,请参阅Vincenzo Maggio's answer
答案 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 :(得分: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
答案 3 :(得分:-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
否则它会被调用compute的函数堆栈帧丢失。