代码之家  ›  专栏  ›  技术社区  ›  Chris Dutrow

请参阅javascript/jquery的click()函数中的旧迭代器值(闭包问题)

  •  4
  • Chris Dutrow  · 技术社区  · 14 年前

    我正在尝试获取“click()”函数来显示 'i' 在我传递函数时。但它指的是 “我” 完成后。关于如何让函数引用 “我” 当我第一次传入函数时。

    for( var i=0; i<10; i++){
     var ts = $('#<span></span>').clone().click(function(){
      alert(i);
     });
    }
    

    注:

    这个 '#' 不应该在那里,也不应该 '.clone()'

    2 回复  |  直到 14 年前
        1
  •  4
  •   Nick Craver    14 年前

    类似这样的事情会奏效:

    for(var i=0; i<10; i++){
      (function(j) {
        var ts = $('<span></span>').click(function(){
            alert(j);
        });
      })(i);
    }
    

    You can give it a try here . 不过,您的创建有点过时,我不知道您为什么要创建一个新元素来克隆它,而且还有一个额外的 # 在那里……我删除了上面的两个,但它不影响内部函数的解决方案。

        2
  •  2
  •   SLaks    14 年前

    您需要将循环体移动到一个单独的函数, 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<10; i++) {
        (function(i) { //Note i parameter
            var ts = $('#<span></span>').clone().click(function(){
                alert(i);
            });
            ...
        })(i);         //Note i parameter
    }