在 2009 年,ECMAScript 5 添加了一个内置bind()
函数,该函数接受一个对象作为参数并返回一个相同的函数,其中this
始终引用您传递给它的对象。(我找不到任何看起来像规范文档链接的东西。)
这与jQuery 的$.proxy()
函数有何不同?$.proxy()
是在 ECMAScript 5 发布之前出现的吗?有什么特别的理由赞成$.proxy(function(){}, this)
吗function(){}.bind(this)
?
在 2009 年,ECMAScript 5 添加了一个内置bind()
函数,该函数接受一个对象作为参数并返回一个相同的函数,其中this
始终引用您传递给它的对象。(我找不到任何看起来像规范文档链接的东西。)
这与jQuery 的$.proxy()
函数有何不同?$.proxy()
是在 ECMAScript 5 发布之前出现的吗?有什么特别的理由赞成$.proxy(function(){}, this)
吗function(){}.bind(this)
?
proxy
排在第一位,你应该喜欢bind
它,因为它是一个标准。它们的调用方式略有不同(由于附加到Function.prototype
函数而不是函数),但它们的行为是相同的。
这里有一篇很好的帖子:jQuery.proxy() 用法,以该建议结尾。
请不要注意这篇文章(尽管是公认的答案)。
长话短说,对问题的上下文做出假设是我自己的错,而不仅仅是查找 API 文档,并且在我意识到自己的愚蠢之前被接受为答案(做出假设,没有验证它们)和删除它。
Matt Whipple 的回答是 100% 正确的,虽然我不同意他的说法,即真正的代理在 JS 中是无用的(在一些低级问题上它们会很棒),但他的其余陈述在客观上是完全正确的(除了实际.bind
vs的日期.proxy
,就像.bind
它在浏览器中一致登陆之前的规范年份一样)。
随意向它扔西红柿。
如果你想知道我为什么会这样回答,请阅读下面的评论。
$({}).proxy()
和之间的区别在于func.bind({})
代理是一个松散的连接。您可以随时分离。这就是代理的用途。你想做的事情和实际要做的事情之间的隐形界面。
作为记录,还有一个
$.bind()
不是代理。也就是说,它完全绑定到this
,以同样的方式func.bind()
,而不是实现一个中介系统来随意附加和分离函数的上下文。
$.proxy
先来。下面是在函数调用中保留特定上下文的简单方法
var myProxy = (function(context,fn){
return function(){
fn.call(context);
}
})( myContext, myFn );
在它出现 jquery 之前,您可以轻松地使用它。
答案很简单:
bind
就是官方。使用bind
- 如果运行脚本所需的浏览器确实支持它
来自下划线绑定 vs jQuery.proxy vs 本机绑定
除了已经提到的之外, 和 之间还有另一个$.proxy()
区别.bind
。与 $.proxy 绑定的方法如果多次调用将返回相同的引用;jQuery 缓存代理到对象的函数。
这是您可以尝试进行性能比较的测试。
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.