JavaScript的咖喱/schönfinkeln
问题描述:
可以说我有以下功能声明JavaScript的咖喱/schönfinkeln
function curry(fn) {
var args = [];
// push everything but function itself into args
for (var i = 1; i < arguments.length; ++i) {
args.push(arguments[i]);
}
return function() {
var args2 = [];
for (var i = 0; i < arguments.length; i++) {
args2.push(arguments[i]);
}
var argstotal = args.concat(args2);
return fn.apply(argstotal);
};
}
function add(a,b){return a + b};
什么即时试图做的是很明显的,我想讨好的附加功能,不知怎的,它的伟大工程本身
var addCurry = curry(add);
addCurry(10, 20, 12314) // should deliver 30, gives NaN
返回NaN,我不知道我在做什么错...任何人有一个想法?
答
您有一个差一错误的位置:return fn.apply(argstotal)
的第一个参数Function.prototype.apply
是范围之广,this
调用中的值,不的第一个参数。如果你要打印出arguments
从咖喱功能中,您将看到:
- 通
this
通过:function curry(fn) { var args = []; // push everything but function itself into args for (var i = 1; i < arguments.length; ++i) { args.push(arguments[i]); } return function() { var args2 = []; for (var i = 0; i < arguments.length; i++) { args2.push(arguments[i]); } var argstotal = args.concat(args2); return fn.apply(argstotal); }; } function add(a, b) { console.log('debug', this, arguments); return a + b; } var cadd = curry(add, 1); cadd(2);
您可以用两种方法很容易解决这个问题到咖喱功能
- 忽略
this
并且不将其设置为咖喱功能
第一种选择可能会更好,因为它会让开发人员感到惊讶。您可以实现使用:
function curry(fn) {
var args = [];
// push everything but function itself into args
for (var i = 1; i < arguments.length; ++i) {
args.push(arguments[i]);
}
return function() {
var args2 = [];
for (var i = 0; i < arguments.length; i++) {
args2.push(arguments[i]);
}
var argstotal = args.concat(args2);
return fn.apply(this, argstotal); // <-- only change
};
}
function add(a, b) {
console.log('debug', /* this, */ arguments);
return a + b;
}
var cadd = curry(add, 1);
cadd(2);
第二个选项可以与fn.apply(null, argstotal)
实现。