我在 Google Chrome 控制台中尝试了以下操作:
> function t1(f) { return f(1); }
> function t2() { return this+1; }
> t1(t2.call)
TypeError: object is not a function
为什么这不起作用?有没有办法定义一个函数来代替 Function.prototype.call 在这里可以工作?
我在 Google Chrome 控制台中尝试了以下操作:
> function t1(f) { return f(1); }
> function t2() { return this+1; }
> t1(t2.call)
TypeError: object is not a function
为什么这不起作用?有没有办法定义一个函数来代替 Function.prototype.call 在这里可以工作?
它不起作用,因为当你通过时t2.call
,你实际上只是在通过.call
。换句话说,它不记得传递它的对象。
要完成您想要的,您可以使用.bind()
.
t1(t2.call.bind(t2))
t2
这会将函数绑定为 的this
值.call
,这意味着您将.call
像执行此操作一样调用:
t2.call
...这就是你想要的。
.bind
IE8 及更低版本以及其他一些较旧的浏览器不支持该方法,但在这些情况下您可以实现大部分完整的 shim。
仅供参考,如果你需要这个很多,你可以绑定.call
为调用上下文.bind
来缩短它。
var callBind = Function.prototype.bind.bind(Function.prototype.call);
所以现在你有一个.bind()
以.call()
bound 作为其调用上下文的函数。当您调用它时,就好像您正在这样做:
.call.bind(/* the function */)
所以callBind()
将返回一个以the function
bound 作为 的调用上下文的函数.call
,就像我们在上面所做的那样。所以你会像这样使用它:
t1(callBind(t2))
为什么要以艰难的方式做事?您不能将回调函数发送t2
到t1
并call()
在内部使用t1
吗?
function t1(f) {
return f.call(1);
}
function t2() {
return this+1;
}
t1(t2);