0

可能重复:
循环内的 Javascript 闭包 - 简单的实际示例

for (i = 0; i < 100; i++) {
    setTimeout(function() {
        console.log(i);
    }, 500)
}

在上面的代码中,它只会打印 100。我知道原因。但是我如何将当前的 i 值发送到回调中setTimeout

4

4 回答 4

2

在循环中使用匿名函数来创建闭包:

for (i = 0; i < 100; i++) {

  (function(i){

    window.setTimeout(function() {
      console.log(i);
    }, 500)

  })(i);

}

当您在调用时将值传递给函数时,该值将被复制,并且函数的每个实例都将拥有自己的副本,当循环计数器更改时不会更改。

于 2012-09-22T19:33:38.107 回答
1

setTimeout 接受传递给回调的参数

for (i=0;i<100;i++){
    setTimeout(function(i){
        console.log(i);
    },500, i)
}
于 2012-09-22T19:32:53.980 回答
0

这有效:

for (var i = 0; i < 100; i++) {
    (function(i) {
        setTimeout(function() {
            console.log(i);
        }, 500);
    })(i);
}​
于 2012-09-22T19:33:16.337 回答
0
for (i = 0; i < 100; i++) {
    setTimeout((function(i) {
        return function(){
            console.log(i);
        }
    })(i), 500)
}
于 2012-09-22T19:33:50.783 回答