2009年,ECMAScript 5添加了内置的bind()
函数,它以一个对象作为参数并返回一个相同的函数,其中this
将始终引用您传递的对象。(我无法找到任何类似于规范文档链接的东西。)
这与jQuery的$.proxy()
函数有什么不同?是否在ECMAScript 5发布之前就已经存在$.proxy()
?有没有特别的理由支持$.proxy(function(){}, this)
而不是function(){}.bind(this)
?
2009年,ECMAScript 5添加了内置的bind()
函数,它以一个对象作为参数并返回一个相同的函数,其中this
将始终引用您传递的对象。(我无法找到任何类似于规范文档链接的东西。)
这与jQuery的$.proxy()
函数有什么不同?是否在ECMAScript 5发布之前就已经存在$.proxy()
?有没有特别的理由支持$.proxy(function(){}, this)
而不是function(){}.bind(this)
?
proxy
函数是先出现的,但是你应该更倾向于使用 bind
函数,因为它是标准的写法。它们的调用方式略有不同(因为 bind
函数附加在 Function.prototype
上,而 proxy
函数只是一个函数),但它们的行为是相同的。
这里有一篇很好的文章:jQuery.proxy() usage,最后也给出了这个建议。
请不要关注这篇文章(尽管它是被接受的答案)。 长话短说,这是我的错,因为我对问题的上下文做出了假设,而没有查找API文档,在我意识到自己的愚蠢(在未验证其假设的情况下做出假设)并删除它之前,它被接受为答案。
Matt Whipple的答案是100%正确的,虽然我不同意他的观点,即在JS中真正的代理无用(在某些低级关注点上,它们将非常好),但他的其他陈述是完全客观正确的(除了.bind
与.proxy
的实际日期,因为.bind
在规范中出现的年份比它在浏览器中稳定地出现之前要早几年)。
随便扔西红柿。
如果你想知道我为什么会以这种方式回答,请阅读下面的评论。
$({}).proxy()
和func.bind({})
之间的区别在于代理是一种松散的连接。 你随时可以分离。这就是代理的作用。 在您想要做的事情和实际执行它的东西之间的无形界面。
值得一提的是,还有一个
$.bind()
,它不是代理。也就是说,它完全绑定到this
,就像func.bind()
一样,而不是实现一种中介系统来随时附加和分离函数的上下文。
$.proxy
函数首先被提出来。以下是在函数调用时保留特定上下文的简单方法。
var myProxy = (function(context,fn){
return function(){
fn.call(context);
}
})( myContext, myFn );
bind
是官方支持的。如果脚本需要运行,就使用支持bind
的浏览器。来源于Underscore bind vs jQuery.proxy vs Native bind
除了已经提到的区别,$.proxy()
和.bind
之间还有另一个区别。使用$.proxy绑定的方法在多次调用时将返回相同的引用;jQuery缓存了绑定到对象上的函数。
这里有一个你可以尝试的测试,用于性能比较。
http://jsperf.com/bind-vs-jquery-proxy/5
现在是2014年10月。 不同浏览器的性能差异非常大。 IE 11原生绑定速度最快。
然而,在我测试的三个浏览器中,原生绑定都比jquery代理更快。 并且由于bind()是标准的,所以如果可能的话建议坚持使用它。
$.fn.bind
,用于附加事件监听器。 - Matt Whipple$.bind ()
的用途上出现了精神失误,与Function.prototype.bind()
相比。我无法删除它,因为它奇妙地被接受为答案,比我意识到我的假设有多愚蠢还要快。也许我现在会尝试编辑它,既然你提醒了我。 - Norguard$.bind()
(以及类似的 jQuery 静态/实例方法)的幕后。那就是我所指的代理,因为它实际上负责充当动态分派的代理,并且是一个更有趣的问题需要解决(因为直到现在,JS 没有一个优雅的解决方案来实现实际代理;多态性很多,但没有代理)。PS:感谢 Broccoli。 - Norguard