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 函数确保 context(this
变量)在进行函数调用时是 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
.
调用函数的方式
考虑这个简单的函数:
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 函数确保 context(this
变量)在进行函数调用时是 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
.