我在回调中遇到了一些上下文问题。我通过谷歌搜索并找到了几个选项:
- 本地绑定 - 不支持旧浏览器
- JQuery代理
- underscore绑定
如果不需要支持旧浏览器,我肯定会使用本地绑定。这些选项之间有什么显著的区别应该注意吗?
这些选项能否作为调用/应用的替代方案使用?
我在回调中遇到了一些上下文问题。我通过谷歌搜索并找到了几个选项:
如果不需要支持旧浏览器,我肯定会使用本地绑定。这些选项之间有什么显著的区别应该注意吗?
这些选项能否作为调用/应用的替代方案使用?
$(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
调用和应用方法用于调用函数,而绑定方法则返回一个函数对象,可用作引用(例如在回调中使用)。因此,绑定方法和调用/应用通常没有相同的用例。
话虽如此,MDN在方法规范页面上为函数对象的绑定方法提供了一个polyfill (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind),以防您需要在不支持它的浏览器中使用它(基本上是IE<8...所以在我看来,只有IE8是我支持但本地不支持它的浏览器)。
最后,请勿仅因需要其中一个函数而考虑包含整个库。