考虑这个简单的功能:
function my(p) { console.log(p) }
我可以这样称呼它:
my("Hello");
也是如此:
my.call(this, "Hello");
此外,这是可能的:
Function.prototype.call.call(my, this, "Hello");
我对最后一个选项感兴趣 - 功能最强的选项,但由于时间太长,我试图做一个简写:
var call = Function.prototype.call.call;
为了打电话给我这样:
call(my, this, "Hello");
但是我得到了这个TypeError:
TypeError: Function.prototype.call called on incompatible undefined
有人知道,这里有什么问题吗?
答案 0 :(得分:8)
当你说
时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
函数返回一个新函数,在调用时将上下文(this
)设置为Function.prototype.call
。
答案 1 :(得分:4)
call
会在内部使用this
。
通过无上下文调用它,您已将this
的内部值从有权访问函数原型的内容更改为window
。
答案 2 :(得分:3)
如果你想这样做,那么考虑一下(如果你有一个符合ES5的解释器):
var call = Function.prototype.call.bind(Function.prototype.call)
bind函数确保函数调用时上下文(this
变量)为Function.prototype.call
而不是undefined
,如你所见。