为什么 fn.call() 在分配给变量后会失败

Why does fn.call() fail after being assigned to a variable

假设我们创建了一个简单的函数

> function foo() { return 0; }

我们可以直接调用它

> foo();
> 0

或者我们可以使用 Function.prototype.call() 方法调用它

> foo.call({}); // Using empty object as this arg
> 0

到目前为止一切顺利。现在这里是事情变得奇怪的地方。我们总是可以将一个函数赋给javascript中的一个变量,然后用一个新的名字

调用它
> var x = foo;
> x();
> 0

但是,如果我们用 Function.prototype.call() 尝试同样的事情,我们会得到一个错误

> var x = foo.call;
> x({});
> Uncaught TypeError: x is not a function

我想这与原型链在 javascript 中的工作方式有关。有人可以向我解释这里的问题吗?

当您获取对 call 函数的引用时:

var x = foo.call;

它不会继承 context。为了让它工作,你需要 bind 上下文 call:

function foo() { return 0; }

var x = foo.call.bind(foo);

x(); //0

这个也可以通过创建后绑定来完成 x:

function foo() { return 0; }

var x = foo.call;

x.bind(foo)(); //0