我正在使用Function.prototype作为学习练习,并试图制作一个可以像这样使用的通用咖喱方法:
// Any old function
var myFn = function(arg1, arg2) {
console.log(arg1, arg2);
};
// Curry some parameters and return a new function
var myFnCurry = myFn.curry("A");
// Call the curried function, passing in the remaining parameters
myFnCurry("B"); // Outputs: A B
将此功能实现为功能而不是使用以下方法的方法是相当直接的:
var curry = function(fn) {
var slice = Array.prototype.slice,
args = slice.call(arguments, 1);
return function() {
fn.apply(this, args.concat(slice.call(arguments)));
};
};
// Example
var myFnCurry = curry(myFn, "A");
myFnCurry("B"); // Outputs: A B
但是,我真的希望能够使用Function原型,如下所示:
Function.prototype.curry = function() {
var slice = Array.prototype.slice,
args = slice.call(arguments);
return function() {
// If we call curry like this: myFn.curry()
// how can we get a reference myFn here?
???.apply(this, args.concat(slice.call(arguments)));
};
};
我不确定如何获取对myFn函数的引用(由上面的???表示)来调用curry方法。
在这种情况下有没有办法访问父函数?
干杯,
伊恩
答案 0 :(得分:2)
您在函数对象(myFn.curry
)的上下文中调用curry,因此curry this
内部引用该函数。但是你的内部函数将在全局对象的上下文中调用,这就是为什么你需要在闭包中存储对外部函数的引用。
Function.prototype.curry = function() {
var self = this, args = [].slice.call(arguments)
return function() {
return self.apply(this, args.concat([].slice.call(arguments)));
}
}