2009年,ECMAScript 5添加了一个内置的bind()
函数,它将一个对象作为参数并返回一个相同的函数,其中this
将始终引用您传递它的对象。 (我找不到任何看起来像规范文档链接的内容。)
这与jQuery's $.proxy()
function有什么不同?在ECMAScript 5发布之前,$.proxy()
是否排在第一位?是否有特别理由支持$.proxy(function(){}, this)
而不是function(){}.bind(this)
?
答案 0 :(得分:33)
proxy
排在第一位,您可能会赞成bind
,因为它是标准。调用它们的方式略有不同(由于附加到Function.prototype
而不仅仅是一个函数),但它们的行为是相同的。
这里有一篇非常好的帖子:jQuery.proxy() usage,以该建议结束。
答案 1 :(得分:10)
请不要理会这篇文章(尽管是接受的答案) 简而言之,对问题的背景做出假设是我自己的错,而不仅仅是查找API文档,并且在我意识到自己的愚蠢(做出假设,而不验证它们)之前被接受为答案。删除它。
Matt Whipple的回答是100%正确的,虽然我不同意他的说法,即真正的代理在JS中是无用的(他们在某些低级别的问题上会很棒),但他的其余陈述在客观上是正确的(除了.bind
与.proxy
的实际日期之外,因为.bind
在浏览器中始终登陆之前的规格年数。)
随意扔西红柿。
如果你想知道我为什么回答我的方式,请阅读以下评论。
$({}).proxy()
和func.bind({})
之间的区别在于代理是一个松散的连接。 您可以随时分离。这就是代理的用途。 你想要做的事与实际做事之间的不可见接口。
对于记录,还有
$.bind()
,它不是代理。也就是说,它与this
完全绑定,与func.bind()
完全绑定,而不是实现一个中介系统来随意附加和分离上下文。
答案 2 :(得分:7)
$.proxy
排在第一位。
下面是一个在函数调用
var myProxy = (function(context,fn){
return function(){
fn.call(context);
}
})( myContext, myFn );
你可以在jquery出现之前轻松使用它。
答案很简单:
bind
是官员。
使用bind
- 如果浏览器确实支持运行脚本
答案 3 :(得分:5)
来自Underscore bind vs jQuery.proxy vs Native bind
除了已经提到的内容之外,$.proxy()
和.bind
之间还存在另一个区别。如果多次调用,与$ .proxy绑定的方法将返回相同的引用; jQuery缓存代理到Object的函数。
答案 4 :(得分:1)
以下是您可以尝试进行性能比较的测试。
http://jsperf.com/bind-vs-jquery-proxy/5
此时,2014年10月。 浏览器之间的性能差异很大。 IE 11本机绑定速度最快。
但是,对于我测试过的所有三个浏览器,native bind out preform jquery proxy。 由于bind()是标准的,我建议如果可能的话坚持下去。