在函数声明时而不是运行时使用变量的值?

时间:2011-04-06 20:09:52

标签: javascript jquery closures

这应该是一个非常简单的问题,我已经足够了解应该有一个明显的解决方案,但我认为我很难说出来。

我在JS / jQuery中运行一个循环,它将函数绑定到某些元素的事件。由于元素是动态添加到页面的,我希望函数包含对它将要修改的特定元素的引用。下面显示了一个简化示例,以及我正在使用的变通方法代码。

for (row = 0; row < numOfRows; row++) {
    $('#row' + row + ' input').keyup(function () {
        alert($(this).parent().parent().get(0).id);    
    });
}

这里的问题是,为了获得对行的引用,而不是使用循环中使用的变量,我必须以冗长的方式从行的ID中提取引用(在上面的代码中) ,然后有另一条线从标识符中删除“行”,为清楚起见省略。)

我想要工作的东西类似于:

for (row = 0; row < numOfRows; row++) {
    $('#row' + row + ' input').keyup(function () {
        alert(row);
    });
}

但是,这显然只返回要添加的最后一个元素的ID。我确信有一个简单的方法来获取变量的值而不是对它的引用,但我还没有遇到它。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:8)

for (var row = 0; row < numOfRows; row++) {
    (function(row) {
        $('#row' + row + ' input').keyup(function() {
            alert(row);
        });
    })(row);
}

这会创建一个新的闭包,因为该行作为函数参数传递,所以它与循环变量“分离”。