Javascript AJAX闭包和目标定位&x27;这';

Javascript AJAX闭包和目标定位&x27;这';,javascript,jquery,Javascript,Jquery,在下面的代码示例中,成功回调函数记录“input#04.update”四次,而不是记录每个输入,这对于了解闭包的工作方式是有意义的,但我如何使用此函数针对每个输入 <input type="text" name="" id="01" class="update"> <input type="text" name="" id="02" class="update"> <input type="text" name="" id="03" class="update"&g

在下面的代码示例中,成功回调函数记录“input#04.update”四次,而不是记录每个输入,这对于了解闭包的工作方式是有意义的,但我如何使用此函数针对每个输入

<input type="text" name="" id="01" class="update">
<input type="text" name="" id="02" class="update">
<input type="text" name="" id="03" class="update">
<input type="text" name="" id="04" class="update">

function updateFields(){
 $('input.update').each(function(){
    $this = $(this);
    $.ajax({
      data: 'id=' + this.id,
      success: function(resp){
       console.log($this);
          $this.val(resp)
      }
    });
  });
}

函数updateFields(){
$('input.update')。每个(函数(){
$this=$(this);
$.ajax({
数据:“id=”+this.id,
成功:功能(resp){
console.log($this);
$this.val(resp)
}
});
});
}

您忘记了
var

var $this = $(this);
不要忘记
var
。一个程序员忘了
var
,晚上睡觉醒来发现他的公寓着火了。他加了
var
,火就灭了。另一位程序员在前往欧洲出差前不久就完全离开了
var
。飞机起飞后不久就出现了飞行中的机械故障,导致飞行员启动了紧急着陆程序。程序员从笔记本电脑中迅速添加了
var
,飞机安全抵达机场


不要忘记
var
。如果你在代码中加入
var
,你今天会遇到一个特别的人。试试看。听起来很神奇,但它确实有效

Pointy在
var
用法上是正确的,另一种选择是使用,如下所示:

function updateFields(){
 $('input.update').each(function(){
    $.ajax({
      data: 'id=' + this.id,
      success: $.proxy(function(resp){
                 $(this).val(resp);
               }, this)
    });
  });
}

当您在
success
回调中时,此闭包创建者将使
This
引用输入元素,这通常是您所追求的……因此我不确定默认情况下为什么不是这样,但无论如何都会纠正这种情况。

这太神奇了。。。但是你能告诉我这样做的技术原因吗?我的意思是,我有时会忘记添加
var
。。。我没有遇到任何问题。但是你的话很吓人,从现在起我不会忘记添加
var
。无论如何对于此类问题,您是否有技术上的解释?原因是:您的
success
处理程序,匿名函数引用了一个
$this
全局变量。因此,这个匿名函数的4个实例中的每一个都引用了相同的变量,因此也引用了相同的值,因为它们是在
每个
函数返回很久之后执行的。@Cristian-如果没有
var
,它是一个全局变量,您正在更新每个循环,在这种情况下,这不是你想要的闭包的局部范围。尼克是对的-没有明确的
var
,不仅你的爱情生活会彻底崩溃,而且你的变量都是全局的。@Nick&@Pointy非常感谢你。。。我很高兴能学到新东西
$.proxy()
很好,但我希望它也支持原型的
.bind
支持的“参数填充”或伪咖喱。现在,我必须检查一下新ECMAScript 5 <代码> .BIN < /C>是否像原型。@ PosiTy-第二个<代码> $PROXY()/代码>方法可以根据你如何构造它来做一些这样的突变…但是,它不符合Par原型,但我认为它并没有遗漏太多……我认为这两个库只是采用了一种非常不同的方法来绑定和迭代闭包,jQuery往往会为您创建更多闭包,无论是好是坏。@Nick Craver-+1-谢谢你。这是一个好主意,我不会考虑。@Pointy-你说的“参数填充”或“假咖喱”是什么意思?这是一个技巧,就像
$.proxy
绑定“this”指针一样。此外,某些库(如Prototype和Functional,可能还有下划线)还允许您获取一个函数并生成一个新函数,该函数将始终为原始函数提供一些特定的参数。这就像,如果您想要像jQuery
attr()
这样总是返回“id”的函数,您可以创建一个总是调用
attr('id')
的函数并使用它。这是函数式编程世界中常见的一种方法(Scheme、Haskell等)