2010-06-11 35 views
9

在下面的代码示例中,成功回调函数记录了“输入#04.update”四次而不是每个单独的输入,这有助于了解闭包如何工作,但我将如何定位每个个人输入使用此。AJAX Closures and targeting'this'

<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) 
     } 
    }); 
    }); 
} 

回答

12

你忘了var

var $this = $(this); 

不要忘记var。一位忘记了var的程序员晚上睡觉,醒来后发现他的公寓着火。他补充说,var和火灾熄灭。另一名程序员在离开欧洲之前不久离开了var列出了完全。飞机在起飞后不久就出现飞行中的机械问题,导致飞行员启动紧急着陆程序。在他的笔记本电脑上,程序员迅速添加了var,飞机将其安全地送到了机场。

别忘了var。如果你在你的代码中加入var,你今天就会遇到一些特别的。尝试一下。这听起来很神奇,但它真的有用!

+0

这太神奇了...但是......你能告诉我一个技术理由吗?我的意思是,我有时忘记添加'var' ...并且我没有遇到问题。但是你的话很可怕,从现在起我不会忘记添加'var'。无论如何...你有这种问题的技术解释吗? – Cristian 2010-06-11 14:11:59

+0

原因:你的'成功'处理程序,匿名函数引用一个'$ this'变量是全局变量。因此,这个匿名函数的4个实例中的每一个都引用相同的变量,因此它们具有相同的值,因为它们在'each'函数返回后很长时间执行。 – Alsciende 2010-06-11 14:15:21

+1

@Cristian - 没有'var',它是一个全局变量,你正在更新每个循环,而不是本地化到你想要的闭包范围。 – 2010-06-11 14:15:32

3

尖尖的正确的var使用,另一种选择是使用$.proxy(),像这样:

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

此次关闭的创建者将this指的是输入元素,当你的success回调,这通常是内部你在追求什么...所以我不知道为什么这不是默认情况下,但无论如何$.proxy()纠正了这种情况。

+0

+1让我读了'$ .proxy()'。 – user113716 2010-06-11 14:05:57

+0

'$ .proxy()'很好,但我希望它也支持“参数填充”或原型的'.bind'支持的假冒柯立。现在我必须检查新的ECMAScript 5'.bind'是否像Prototype的。 – Pointy 2010-06-11 14:12:57

+0

@Pointy - 第二个'.proxy()'方法可以做这样的一些变化,这取决于你如何构造它......但是,它不符合标准原型,但我认为它并不是真的缺少很多......我认为这两个库只是采取了一种截然不同的方式来绑定和迭代,jQuery倾向于为你创造更多的更好或更糟的方式。 – 2010-06-11 14:18:12