2013-07-10 59 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>