我在 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
函数绑定(bind)为 .call
的 this
值,这意味着您将调用 .call
就好像你已经这样做了:
t2.call
...这就是您想要的。
.bind
方法在 IE8 及更低版本以及其他一些较旧的浏览器中不受支持,但您可以在这些情况下实现基本完整的 shim。
仅供引用,如果您非常需要这个,您可以将 .call
绑定(bind)为 .bind
的调用上下文以缩短它一点。
var callBind = Function.prototype.bind.bind(Function.prototype.call);
现在你有一个 .bind()
函数,将 .call()
绑定(bind)为它的调用上下文。当您调用它时,就好像您正在这样做:
.call.bind(/* the function */)
所以 callBind()
将返回一个函数,其中 the function
绑定(bind)为 .call
的调用上下文,就像我们上面所做的那样。所以你会像这样使用它:
t1(callBind(t2))
关于javascript - 使用 Function.prototype.call 作为回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13215761/