使用Function.prototype方法时访问父函数

时间:2011-02-19 06:10:03

标签: javascript

我正在使用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方法。

在这种情况下有没有办法访问父函数?

干杯,

伊恩

1 个答案:

答案 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)));
  }
}