返回javascript/jQuery的click()函数中的旧迭代器值(闭包问题)
我试图让“click()”函数显示我传入函数时返回javascript/jQuery的click()函数中的旧迭代器值(闭包问题),javascript,jquery,closures,Javascript,Jquery,Closures,我试图让“click()”函数显示我传入函数时'I'的值。但它在完成后引用了'i'的值。当我第一次传入函数时,如何让函数引用'I'的值,这是一个空白 for( var i=0; i<10; i++){ var ts = $('#<span></span>').clone().click(function(){ alert(i); }); } for(var i=0;i您需要将循环体移动到一个单独的函数,该函数将i作为参数 您可以使用普通函数,如下所示: f
'I'
的值。但它在完成后引用了'i'
的值。当我第一次传入函数时,如何让函数引用'I'
的值,这是一个空白
for( var i=0; i<10; i++){
var ts = $('#<span></span>').clone().click(function(){
alert(i);
});
}
for(var i=0;i您需要将循环体移动到一个单独的函数,该函数将i
作为参数
您可以使用普通函数,如下所示:
for(var i=0; i<10; i++) {
makeCopy(i);
}
function makeCopy(i) {
var ts = $('#<span></span>').clone().click(function(){
alert(i);
});
}
for(var i=0;i类似的东西可以工作:
for(var i=0; i<10; i++){
(function(j) {
var ts = $('<span></span>').click(function(){
alert(j);
});
})(i);
}
<代码> >(var i=0;i + 1)用于正确推断问题。考虑将问题滚回到原点。给出的答案在改变问题时没有意义。您的第二种方法在所有情况下都会提醒10
。@SLaks-因为i
仍然引用同一个外部变量,所以您可以在这里测试它:您必须将i
传递到函数中才能获得副本。为了清楚起见,我会在函数中重命名该变量,但实际上它可以工作:)从技术上讲,它会提醒undefined
,因为i
在内部和外部使用。这是正确的答案;将事件处理程序包装在匿名函数中并传递它,我会生成所需的闭包。嘿,Nick,我想我在某处读到jQuery会在创建元素后保存它,因此如果需要,必须克隆它一个新的。我甚至在内存上也不清楚,所以这可能是错误的。@DutrowLLC-是的,如果用于创建它的HTML字符串短于512字节,那么它创建的文档片段会被缓存,但已经被克隆(为了速度),所以你不需要自己动手:)
for(var i=0; i<10; i++){
(function(j) {
var ts = $('<span></span>').click(function(){
alert(j);
});
})(i);
}