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的解决方案才有效.
你可以将函数放在循环中:
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中.)