30

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

这与jQuery 的$.proxy()函数有何不同?$.proxy()是在 ECMAScript 5 发布之前出现的吗?有什么特别的理由赞成$.proxy(function(){}, this)function(){}.bind(this)

4

5 回答 5

37

proxy排在第一位,你应该喜欢bind它,因为它是一个标准。它们的调用方式略有不同(由于附加到Function.prototype函数而不是函数),但它们的行为是相同的。

这里有一篇很好的帖子:jQuery.proxy() 用法,以该建议结尾。

于 2012-09-19T19:08:16.340 回答
9

编辑

请不要注意这篇文章(尽管是公认的答案)。
长话短说,对问题的上下文做出假设是我自己的错,而不仅仅是查找 API 文档,并且在我意识到自己的愚蠢之前被接受为答案(做出假设,没有验证它们)和删除它。

Matt Whipple 的回答是 100% 正确的,虽然我不同意他的说法,即真正的代理在 JS 中是无用的(在一些低级问题上它们会很棒),但他的其余陈述在客观上是完全正确的(除了实际.bindvs的日期.proxy,就像.bind它在浏览器中一致登陆之前的规范年份一样)。

以下是我的耻辱,在股票中供所有人查看...

随意向它扔西红柿。
如果你想知道我为什么会这样回答,请阅读下面的评论。


$({}).proxy()和之间的区别在于func.bind({})代理是一个松散的连接。您可以随时分离。

这就是代理的用途。你想做的事情和实际要做的事情之间的隐形界面。

作为记录,还有一个$.bind()不是代理。也就是说,它完全绑定到this,以同样的方式func.bind(),而不是实现一个中介系统来随意附加和分离函数的上下文。

于 2012-09-19T19:51:36.193 回答
8

$.proxy先来。下面是在函数调用中保留特定上下文的简单方法

var myProxy = (function(context,fn){
  return function(){
      fn.call(context);
  }
})( myContext, myFn );

在它出现 jquery 之前,您可以轻松地使用它。

答案很简单: bind就是官方。使用bind - 如果运行脚本所需的浏览器确实支持它

于 2012-09-19T19:14:27.417 回答
6

来自下划线绑定 vs jQuery.proxy vs 本机绑定

除了已经提到的之外, 和 之间还有另一个$.proxy()区别.bind。与 $.proxy 绑定的方法如果多次调用将返回相同的引用;jQuery 缓存代理到对象的函数。

jsFiddle

于 2014-09-05T10:28:21.143 回答
1

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

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

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

However, for all three browsers I tested with, native bind out preform jquery proxy. And since bind() is standard, I would suggest sticking to it if possible.

于 2014-10-08T18:32:06.097 回答