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

时间:2014-02-15 21:21:41

标签: javascript jquery

这段代码有什么问题?读这个似乎对于每个循环,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]

4 个答案:

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