$ .proxy()和bind()有什么区别?

时间:2012-09-19 19:05:17

标签: javascript jquery scope closures bind

2009年,ECMAScript 5添加了一个内置的bind()函数,它将一个对象作为参数并返回一个相同的函数,其中this将始终引用您传递它的对象。 (我找不到任何看起来像规范文档链接的内容。)

这与jQuery's $.proxy() function有什么不同?在ECMAScript 5发布之前,$.proxy()是否排在第一位?是否有特别理由支持$.proxy(function(){}, this)而不是function(){}.bind(this)

5 个答案:

答案 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的函数。

jsFiddle

答案 4 :(得分:1)

以下是您可以尝试进行性能比较的测试。

http://jsperf.com/bind-vs-jquery-proxy/5

此时,2014年10月。 浏览器之间的性能差异很大。 IE 11本机绑定速度最快。

但是,对于我测试过的所有三个浏览器,native bind out preform jquery proxy。 由于bind()是标准的,我建议如果可能的话坚持下去。