为什么 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
假设我们创建了一个简单的函数
> 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