2013-07-10 62 views
0

我对这个代码的示例:的Javascript不能读取功能()可变

<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 3号”);

任何人都可以帮助吗?谢谢:)

+1

可能重复:http://stackoverflow.com/questions/10954053/javascript-variable-scope-内换环 –

+0

其有关查询搜索...但感谢你的suqestion –

回答

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

您正在使用setTimeout回调,其值只有当回调到那时,执行评估内部封闭的可变ii值将由外循环

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); 
} 
0

你需要我的价值对每个迭代封闭:

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

欢迎您:) –

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>