返回javascript/jQuery的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

我试图让“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
作为参数

您可以使用普通函数,如下所示:

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