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

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(),而不是实现一个中介系统来随意附加和分离上下文的功能.

  • 这两个函数都是高阶函数,返回强制执行一致上下文的函数.在其他形式中创建"代理"的想法在JS中是浪费的.jQuery中唯一的绑定是熟悉的`$ .fn.bind`,它用于附加事件监听器. (3认同)

abu*_*uba 7

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

var myProxy = (function(context,fn){
  return function(){
      fn.call(context);
  }
})( myContext, myFn );
Run Code Online (Sandbox Code Playgroud)

你可以在jquery出来之前轻松使用它.

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


Ben*_*ema 5

来自Underscore绑定vs jQuery.proxy vs Native绑定

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

的jsfiddle