如何在JavaScript中复制变量?

Mic*_*tum 3 javascript jquery closures loops

我有这个JavaScript代码:

for (var idx in data) {
    var row = $("<tr></tr>");
    row.click(function() { alert(idx); });
    table.append(row);
}
Run Code Online (Sandbox Code Playgroud)

所以我正在查看一个数组,动态创建行(我创建单元格的部分被省略,因为它并不重要).重要的是我创建了一个包含idx变量的新函数.

但是,idx只是一个引用,因此在循环结束时,所有行都具有相同的功能,并且所有行都提醒相同的值.

我现在解决这个问题的一种方法是这样做:

function GetRowClickFunction(idx){
    return function() { alert(idx); }
}
Run Code Online (Sandbox Code Playgroud)

在我调用的调用代码中

row.click(GetRowClickFunction(idx));
Run Code Online (Sandbox Code Playgroud)

这有效,但有点难看.我想知道是否有更好的方法可以在循环中复制idx的当前值?

虽然问题本身不是特定于jQuery(它与JavaScript闭包/范围有关),但我使用jQuery,因此只有jQuery的解决方案才有效.

Poi*_*nty 9

你可以将函数放在循环中:

for (var idx in data) {
  (function(idx) {
    var row = $("<tr></tr>");
    row.click(function() { alert(idx); });
    table.append(row);
  })(idx);
}
Run Code Online (Sandbox Code Playgroud)

现在,我想给你的真正建议是停止像这样的事件绑定,并开始使用jQuery"live"或"delegate"API.这样,您可以为表中的所有行设置单个处理程序.为每一行提供"idx"值作为"id"或"class"元素或其他东西,以便您可以在处理程序中将其拉出来.(或者我猜你可以把它存放在"数据"expando中.)