6

我在回调中有一些上下文问题。我用谷歌搜索并发现了几个选项:

  1. 本机绑定 - 旧浏览器不支持
  2. jQuery 代理
  3. 下划线绑定

如果我不必支持旧浏览器,我肯定会使用本机绑定。这些之间是否有任何显着差异应该注意?

这些可以用作呼叫/申请的替代品吗?

4

2 回答 2

18

AFAIK,绑定和代理之间存在细微差别,如果您使用 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
于 2014-04-04T10:48:06.223 回答
2

call 和 apply 方法调用一个函数。bind 方法返回一个可以用作引用的函数对象(例如,用于回调)。因此,bind 和 call/apply 通常没有相同的用例。

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

最后,永远不要仅仅因为你需要它的一个功能就考虑包含整个库。

于 2013-09-17T11:27:27.703 回答