下划线绑定vs jQuery.proxy vs Native绑定

时间:2013-09-17 11:13:25

标签: javascript jquery underscore.js

我在回调中遇到了一些上下文问题。我用Google搜索并找到了一些选项:

  1. 原生绑定 - 旧浏览器不支持
  2. JQuery代理
  3. 下划线绑定
  4. 如果我不必支持旧浏览器,我肯定会使用本机绑定。这些人应该注意哪些有显着差异?

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

2 个答案:

答案 0 :(得分:15)

AFAIK,绑定和代理之间存在细微差别,如果您使用jQuery,这可能很重要。 Function.prototype.bind 总是返回一个新的函数指针。如果尚未创建相同args的代理,则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

答案 1 :(得分:2)

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

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

最后,不要因为需要其中一个功能而考虑包含整个库。