Max*_*tor 26 javascript jquery closures scope bind
在2009年,ECMAScript 5添加了一个内置bind()函数,它将一个对象作为参数并返回一个相同的函数,其中this将始终引用您传递它的对象.(我找不到任何看起来像规范文档链接的东西.)
这与jQuery的$.proxy()功能有何不同?难道$.proxy()是第一位的ECMAScript 5发布之前?是否有特别的原因,有利于$.proxy(function(){}, this)过function(){}.bind(this)?
Mat*_*ple 33
proxy是第一个,你可能会喜欢bind它,因为它是一个标准.调用它们的方式略有不同(由于附加到Function.prototypevs只是一个函数),但它们的行为是相同的.
这里有一个非常好的帖子:jQuery.proxy()用法,以该建议结束.
Nor*_*ard 10
请不要理会这篇文章(尽管是接受的答案).
简而言之,对问题的背景做出假设是我自己的错,而不仅仅是查找API文档,并且在我意识到自己的愚蠢(做出假设,而不验证它们)之前被接受为答案.删除它.
Matt Whipple的回答是100%正确的,虽然我不同意他的说法,即真正的代理在JS中是无用的(在某些低级别的问题中它们会很棒),但他的其余陈述在客观上是完全正确的(除了实际.bindvs的日期.proxy,就像.bind它在浏览器中一直登陆前的规范年份一样).
随意扔西红柿.
如果你想知道我为什么回答我的方式,请阅读下面的评论.
$({}).proxy()和之间的区别func.bind({})是代理是一个松散的连接.您可以随时分离.这就是代理的用途.你想做什么和实际做的事情之间的不可见接口.
为了记录,还有一个
$.bind()不是代理.也就是说,它完全以this同样的方式绑定func.bind(),而不是实现一个中介系统来随意附加和分离上下文的功能.
$.proxy先来了.下面是一个在函数调用中保留特定上下文的简单方法
var myProxy = (function(context,fn){
return function(){
fn.call(context);
}
})( myContext, myFn );
Run Code Online (Sandbox Code Playgroud)
你可以在jquery出来之前轻松使用它.
答案很简单:
bind是官方的.使用bind - 如果在运行脚本所需的浏览器中确实支持它
来自Underscore绑定vs jQuery.proxy vs Native绑定
除了什么已经提到的,还有的另一个区别$.proxy()和.bind.如果多次调用,与$ .proxy绑定的方法将返回相同的引用; jQuery缓存代理到Object的函数.