下划线的bind方法 vs jQuery的proxy方法 vs 原生的bind方法

6

我在回调中遇到了一些上下文问题。我通过谷歌搜索并找到了几个选项:

  1. 本地绑定 - 不支持旧浏览器
  2. JQuery代理
  3. underscore绑定

如果不需要支持旧浏览器,我肯定会使用本地绑定。这些选项之间有什么显著的区别应该注意吗?

这些选项能否作为调用/应用的替代方案使用?

2个回答

18
据我所知,绑定(bind)和代理(proxy)之间存在一些微小的差异,如果你正在使用jQuery,这可能会很重要。 Function.prototype.bind总是返回一个新的函数指针。只有当相同参数的代理尚未被创建时,jQuery.proxy才会返回一个新的函数。并不是说你想这样做,但是:
$(elm).on('click', doStuff.bind(thing)); //adds event handler
$(elm).off('click', doStuff.bind(thing)); //does not remove event handler as 2nd call of doStuff.bind(thing) always returns a new/different function

$(elm).on('click', $.proxy(doStuff, thing)); //adds handler
$(elm).off('click', $.proxy(doStuff, thing));//DOES remove handler, as a second call to $.proxy(doStuff, thing) is smart enough to know about similar use-cases

//Likewise, if you just passed 'thing.doStuff()' into the $.off() method, it would also work

2
通过这个jsFiddle测试进行了确认。同时打开两个事件处理程序,然后再将它们关闭,可以确认.bind()事件处理程序仍然会触发。 - Benny Bottema
这整个“函数指针”情况总是让我对设计事件系统的人感到非常恼火。谢谢! - nightpool

2

调用和应用方法用于调用函数,而绑定方法则返回一个函数对象,可用作引用(例如在回调中使用)。因此,绑定方法和调用/应用通常没有相同的用例。

话虽如此,MDN在方法规范页面上为函数对象的绑定方法提供了一个polyfill (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind),以防您需要在不支持它的浏览器中使用它(基本上是IE<8...所以在我看来,只有IE8是我支持但本地不支持它的浏览器)。

最后,请勿仅因需要其中一个函数而考虑包含整个库。


所以代理和绑定是完全相同的吗? - RuntimeException
你可以阅读文档 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind vs http://api.jquery.com/jQuery.proxy/ - 但是$.proxy()的目的与bind()相同 - 改变给定函数的上下文(即'this'引用)。 - Adam Jenkins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接