0

我有一个关于这段代码的例子:

<script>
    for(var i=1; i<3; i++){
        setTimeout(function(){
            say("HELLO NUMBER " + i);
        }, i * 2000);
    }

    function say(text){
        alert(text);
    }
</script>

我需要的输出是:

alert("你好 1 号");

alert("你好 2 号");

但在这种情况下,我仍然得到输出:

alert("你好 3 号");

任何人都可以为此提供帮助吗?谢谢 :)

4

4 回答 4

7

闭包的经典问题

for(var i=1; i<=3; i++){
    (function(num){
        setTimeout(function(){
            say("HELLO NUMBER " + num);
        }, num * 2000);

    })(i)
}

function say(text){
    alert(text);
}

演示:小提琴

i在回调内部使用了一个闭包变量setTimeout,其值仅在回调执行时才被评估,然后i外部循环的值将被更新

于 2013-07-10T05:23:05.670 回答
0

其他方式。

var out = [];
for(var i=0; i<3; ++i){
    out.push(i+1);
    setTimeout(function(){
        say("HELLO NUMBER " + out.shift());
    }, i * 2000);
}

function say(text){
    alert(text);
}
于 2013-07-10T05:44:12.003 回答
0

您需要为每次迭代的 i 值闭包:

for (var i=1; i<3; i++) {
    (function(j){
        setTimeout(function() { alert("HELLO NUMBER " + j); }, j*2000);
    })(i)
}
于 2013-07-10T06:02:20.267 回答
0
<script>
    function doSetTimeout(i) {
         setTimeout(function() { say("HELLO NUMBER " + i); }, 3000);
    }

    for(var i=1; i<3; i++){
        doSetTimeout(i);
    }

    function say(text){
    alert(text);
   }
</script>
于 2013-07-10T06:03:04.147 回答