【发布时间】:2016-08-08 07:51:08
【问题描述】:
我正在阅读一本书,其中包含以下示例:
var composition1 = function(f, g) {
return function(x) {
return f(g(x));
}
};
然后作者写道:“......组合的幼稚实现,因为它没有考虑执行上下文......”
所以首选的功能是:
var composition2 = function(f, g) {
return function() {
return f.call(this, g.apply(this, arguments));
}
};
后面是一个完整的例子:
var composition2 = function composition2(f, g) {
return function() {
return f.call(this, g.apply(this, arguments));
}
};
var addFour = function addFour(x) {
return x + 4;
};
var timesSeven = function timesSeven(x) {
return x * 7;
};
var addFourtimesSeven2 = composition2(timesSeven, addFour);
var result2 = addFourtimesSeven2(2);
console.log(result2);
有人可以向我解释为什么 composition2 函数是首选函数(也许有一个例子)?
编辑:
与此同时,我尝试按照建议使用方法作为参数,但没有奏效。结果是 NaN:
var composition1 = function composition1(f, g) {
return function(x) {
return f(g(x));
};
};
var composition2 = function composition2(f, g) {
return function() {
return f.call(this, g.apply(this, arguments));
}
};
var addFour = {
myMethod: function addFour(x) {
return x + this.number;
},
number: 4
};
var timesSeven = {
myMethod: function timesSeven(x) {
return x * this.number;
},
number: 7
};
var addFourtimesSeven1 = composition1(timesSeven.myMethod, addFour.myMethod);
var result1 = addFourtimesSeven1(2);
console.log(result1);
var addFourtimesSeven2 = composition2(timesSeven.myMethod, addFour.myMethod);
var result2 = addFourtimesSeven2(2);
console.log(result2);
【问题讨论】:
-
这其实和currying无关。
-
你说得对,我改了措辞。
-
叫做FUNCTION合成!看在老天的份上,你为什么要编写方法?函数组合是指将纯函数以柯里化的形式组合起来,没有任何副作用:
const compose = f => g => x => f(g(x))。 Curried 函数,只有一个参数(如我们的compose函数)。函数组合只适用于柯里化函数,因为函数只返回一个值。 -
然后作者写道:“......组合的幼稚实现,因为它没有考虑执行上下文......” 我认为作者很幼稚。
标签: javascript function-composition