将函数的“call”函数存储在变量中

时间:2014-01-22 15:10:02

标签: javascript function functional-programming call prototype

为什么以下内容无法按预期工作?

> function Double() { return this * 2; }
undefined
> Double
[Function: Double]
> Double.call
[Function: call]
> Double.call(8)
16
> var double = Double.call;
undefined
> double
[Function: call]
> double(8); ////// BAM! Why does this not work ??
TypeError: object is not a function
    at repl:1:1
    at REPLServer.defaultEval (repl.js:129:27)
    at bound (domain.js:271:14)
    at REPLServer.runBound [as eval] (domain.js:284:12)
    at Interface.<anonymous> (repl.js:277:12)
    at Interface.EventEmitter.emit (events.js:101:17)
    at Interface._onLine (readline.js:194:10)
    at Interface._line (readline.js:523:8)
    at Interface._ttyWrite (readline.js:798:14)
    at ReadStream.onkeypress (readline.js:98:10)
>

*编辑*

我已经创建了一个函数ref()来实现这个目的:

Function.prototype.ref = function() {
    var that = this;
    return function(thisArg, args) {
        return that.call(thisArg, args);
    };
}

现在Double.ref()是一个可通过的函数,其中第一个参数是this。

1 个答案:

答案 0 :(得分:3)

因为当你这样做时:

var double = Double.call;

你失去了Double的背景。那么当你调用double时,它需要一个函数的上下文(因为这是Function.prototype.call所要求的)并且找不到它。

尝试更简单地说,你试图在不是函数的东西上调用Function.prototype.call

您可以通过将对Double.call的引用绑定回Double来使其工作:

var double = Double.call.bind(Double);
double(8); // 16

为了进一步展示正在发生的事情,您可以使用Function.prototype.call的任何引用,而不仅仅是Double获得的引用:

var double = Function.prototype.call.bind(Double);
double(8); // 16