我在Google Chrome Console中尝试了以下内容:
> function t1(f) { return f(1); }
> function t2() { return this+1; }
> t1(t2.call)
TypeError: object is not a function
为什么这不起作用?有没有办法定义函数代替函数。prototype.call可以在这里工作?
它不起作用,因为当您通过t2.call
时,您实际上只是通过.call
。换句话说,它不记得它通过的对象。
要完成您想要的东西,您可以使用.bind()
。
t1(t2.call.bind(t2))
这将t2
函数绑定为.call
的this
值,这意味着您将调用.call
,就好像您已经完成了:
t2.call
...这是您想要的。
IE8和其他一些较旧的浏览器中不支持.bind
方法,但是在这种情况下,您可以实现大部分完整的垫片。
fyi,如果您需要很多,则可以将.call
绑定为.bind
的调用上下文以缩短它。
var callBind = Function.prototype.bind.bind(Function.prototype.call);
因此,现在您拥有一个.bind()
功能,其中.call()
绑定为其呼叫上下文。当您调用它时,就好像您正在这样做一样:
.call.bind(/* the function */)
因此,callBind()
将返回具有the function
作为.call
的调用上下文的函数,就像我们上面所做的那样。因此,您会这样使用:
t1(callBind(t2))
为什么要遇到困难?您不能仅通过回调函数t2
发送到t1
并在t1
中使用call()
?
function t1(f) {
return f.call(1);
}
function t2() {
return this+1;
}
t1(t2);