javascript - 使用 Function.prototype.call 作为回调

标签 javascript function callback

我在 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)为 .callthis 值,这意味着您将调用 .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/

相关文章:

javascript - Meteor.Error 抛出给客户端时是否会发生变化?

javascript - 将运行时 JavaScript 值添加到 Liferay 动态数据列表

javascript - 使用弹出 html 的 Chrome 扩展解决方法

python - 如何制作功能类似于枚举而不实际使用枚举的代码?

c - 为什么函数要用括号括起来?

callback - 带有参数的 Ionic2 navController pop(回调)

python - 在每 N 个 epoch 结束时保存模型权重

javascript - Facebook 使用 jquery 移动框架

javascript - jquery水平滑动

功能 "normalization"