Javascript无法读取函数中的变量()

时间:2013-07-10 05:20:58

标签: javascript function variables scope

我在这段代码上有一个例子:

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

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

我需要的输出是:

提醒(“HELLO NUMBER 1”);

提醒(“HELLO NUMBER 2”);

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

提醒(“HELLO NUMBER 3”);

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

4 个答案:

答案 0 :(得分:7)

关闭的经典问题

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

    })(i)
}

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

演示:Fiddle

您正在i回调中使用闭包变量setTimeout,其值仅在执行回调时计算,然后i的值将由外部循环更新

答案 1 :(得分: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);
}

答案 2 :(得分:0)

每次迭代都需要一个闭包值i:

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

答案 3 :(得分: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>