2014-02-15 69 views
1

这段代码有什么问题?读这看起来,每个循环jquery应附加一个函数与每个迭代分配的值。相反,它将i = 2附加到每个对象。为什么它这样做,我怎样才能得到它附加的期望值(例如,0,1,...)?Javascript/jQuery将不同的函数参数附加到.click()方法

//data.length is 2. 

for (i=0; i<data.length; i++) { 
    // Attach the click function 
    linkId = 'a#' + pk; 
    $(linkId).click(function(e) { 
     e.preventDefault(); 
     console.log(i, pk, data); 
    }); 
}; 

console.log - 记录每个环节都有相同的参数

2 "52fef25e391a56206f03be6e" [object Array] 
+2

古典闭合回路+混乱。 – dfsq

回答

2

你假设一个块创建新的变量范围。它不在JavaScript中。只有一个函数执行。

如果您改用$.each(),则每次迭代都会调用您提供的回调,因此您将为每个迭代调用一个新的范围。

$.each(data, function(i,item) { 
       // ^---^---function parameters are local to this scope 

// v--declare a variable local to this scope 
    var linkId = 'a#' + pk; 

       // v--the function made in this scope can access the local vars 
    $(linkId).click(function(e) { 
     e.preventDefault(); 
     console.log(i, pk, data, linkId, data[i]); 
    }); 
}); 
+0

这是非常有用的,我用你的答案来解决我手边的问题。谢谢。但是,出于知识的考虑,为了让我的原始代码正常工作,是否有可能在每次迭代的范围内声明变量?我尝试过,但它似乎没有工作。 – James

+1

@TechMedicNYC:不,没有某种函数调用。 JS中的块单独不定义任何类型的变量作用域。 JS的下一个版本将通过使用'let'关键字声明变量来实现块范围。这是今天在Firefox以及最新版本的Chrome(当一个标志被设置时)可用的,我相信IE11。 –

+0

非常感谢您的信息。这是很好的知道。干杯。 – James

0

尝试找出变量的作用域。在循环上下文中声明var j = i;,以便它进入点击回调的范围。

2

游戏机只有当你点击$(linkId)被显示,但在时间是(你的情况又名2)已经等于data.length因此会一直显示2

0

因此,为了创建一个单独的范围为每次迭代,你也可以使用普通的闭包功能,并通过电流i进去:

for (var i = 0; i < data.length; i++) { 
    (function(j) { 
     $('a#' + pk).click(function(e) { 
      e.preventDefault(); 
      console.log(j, pk, data); 
     }); 
    })(i); 
};