shorthand Function.prototype.call.call?

A shorthand for Function.prototype.call.call?

调用函数的方式

考虑这个简单的函数:

function my(p) { console.log(p) }

我可以这样称呼它:

my("Hello");

也喜欢这样:

my.call(this, "Hello");

此外,这是可能的:

Function.prototype.call.call(my, this, "Hello");

A shorthand 功能方式

我对最后一个选项很感兴趣 - 最实用的一个,但由于它太长了,我尝试制作一个 shorthand:

var call = Function.prototype.call.call;

为了这样称呼我:

call(my, this, "Hello");

但是我得到了这个 TypeError:

TypeError: Function.prototype.call called on incompatible undefined

有人知道,这是怎么回事?

如果你想这样做,那么考虑这个(如果你有一个 ES5 兼容的解释器):

var call = Function.prototype.call.bind(Function.prototype.call)

bind 函数确保 contextthis 变量)在进行函数调用时是 Function.prototype.call 而不是 undefined,如您所见。

当你说

var call = Function.prototype.call.call;

最后一个 call 失去了它的实际上下文。您需要明确说明 call 属于 Function.prototype.call.

你可以做到这一点,方法是创建一个新函数,它实际上像这样绑定它

var call = Function.prototype.call.call.bind(Function.prototype.call);
call(my, this, "Hello");
// Hello

bind 函数 returns 一个新函数,调用时会将上下文 (this) 设置为 Function.prototype.call

call,大概是在内部使用了 this

通过在没有上下文的情况下调用它,您已将 this 的内部值从可以访问函数原型的内容更改为 window.