0

我正在尝试将 I 传递给 inputItems[i].on,以便我可以将其设置为执行特定任务(由 createSelectedInputItem(i) 定义),如何将变量 i 传递给 function() { ..operation here }?

for(var i=0; i< 6; i++){
    console.log("setting mouse event for : " + i);

    // Bring in all the input items
    inputItems[i].on('click', function() {

      console.log("i is still:" + i );
      input.tween.reverse();
      console.log("pressed" + i);
      createSelectedInputItem(i);

      for(var j=0; j< 6; j++){
        inputItems[j].tween.reverse();
      } 
    });
  }

日志

//页面加载时

setting mouse event for : 0

setting mouse event for : 1 

setting mouse event for : 2 

setting mouse event for : 3 

setting mouse event for : 4 

setting mouse event for : 5 

//当按下其中一个输入项时

我还在:6

pressed6 

这甚至不存在

4

2 回答 2

0
inputItems[i].on('click', function() {
    // By the time this runs, any variable outside its scope may change,
    // which in this case is 'i' which runs in a loop.
});

您应该像这样包装它来捕获i它:

(function(i) {
    inputItems[i].on('click', function() {
        // Now i is an argument to the wrapping closure
        console.log(i);
    });
})(i);
于 2013-10-30T18:26:02.183 回答
0

您面临的问题是闭包问题,这是 Javascript 范围界定的一个稍微不直观的方面。

考虑一下你有多少变量。变量i存在多少次?答案是“定义范围的次数i”。在这种情况下,这意味着只有一个变量i,在整个代码中都会引用它。

你做一个循环i

for(var i=0; i< 6; i++){

在此循环完成后(在您进行任何点击之前发生),i6. 它永远不会再改变,也永远不会引用任何其他数字。

所以点击处理程序触发,这行代码运行:

console.log("i is still:" + i );

i是同一个变量,因此它将是 value 6

解决这个问题的方法是为循环的每次迭代引入一个新变量。

for (var i = 0; i < 6; i++) {
    (function (innerI) { // create a function with an argument called innerI
        console.log("setting mouse event for : " + i);

        // Bring in all the input items
        inputItems[innerI].on('click', function () {
            console.log("i is still:" + i);
            console.log("innerI is: " + innerI);
            input.tween.reverse();
            console.log("pressed" + innerI);
            createSelectedInputItem(i);

            for (var j = 0; j < 6; j++) {
                inputItems[j].tween.reverse();
            }
        });
    }(i)); // invoke the function with i as the argument
}

在这段代码中,我们创建了一个匿名函数。该函数接受一个参数,innerI。然后我们立即调用该函数,并i作为参数传递。这会创建一个新范围和一个新变量,因此i++在循环结束时不会更改。

于 2013-10-30T18:33:44.887 回答