这段代码有什么问题?读这个似乎对于每个循环,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]
答案 0 :(得分:2)
控制台仅在您单击$(linkId)
时显示,但当时已经等于data.length
(在您的情况下又称为2),因此它将始终显示2
答案 1 :(得分: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]);
});
});
答案 2 :(得分:0)
尝试隔离变量的范围。在循环上下文中声明var j = i;
,以便它进入click-callback的范围。
答案 3 :(得分: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);
};