Javascript / jQuery将不同的函数args附加到.click()方法

这段代码出了什么问题? 读这个似乎对于每个循环,jquery应该为每个迭代附加一个具有赋值的函数。 相反,它将i = 2附加到每个对象。 它为什么这样做,如何让它附加预期的值(例如,0,1,……)?

//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] 

您假设块创建了一个新的变量范围。 它不是在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]); }); }); 

只有当你单击$(linkId)时才会显示控制台,但此时它已经等于data.length (在你的情况下又称为2)所以它总是会显示2

尝试隔离变量的范围。 声明var j = i; 在循环上下文中,所以它进入click-callback的范围。

因此,为了为每次迭代创建一个单独的作用域,您还可以使用普通的闭包函数,并将当前的i传递给它:

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