var i;
var print = function(){
console.log(i);
};
for(i = 0 ; i<10;i++){
setTimeout(print,1000);
};
它打印10次10次我不明白爲什麼?它打印10次10次我不明白爲什麼?
var i;
var print = function(){
console.log(i);
};
for(i = 0 ; i<10;i++){
setTimeout(print,1000);
};
它打印10次10次我不明白爲什麼?它打印10次10次我不明白爲什麼?
setTimeout
是一個異步調用。這意味着,它只有在整個循環得到執行後纔會執行。在你的JS解釋,這將是這樣的:
1: for loop. // i = 0
2: send setTimeout #1. increment i. // i = 1
3: send setTimeout #2. increment i. // i = 2
4: send setTimeout #3. increment i. // i = 3
5: send setTimeout #4. increment i. // i = 4
6: send setTimeout #5. increment i. // i = 5
7: send setTimeout #6. increment i. // i = 6
8: send setTimeout #7. increment i. // i = 7
9: send setTimeout #8. increment i. // i = 8
10: send setTimeout #9. increment i. // i = 9
11: send setTimeout #10. increment i. // i = 10
12: finish for loop. // i = 10
13: exec setTimeout #1. // i = 10
14: exec setTimeout #2. // i = 10
15: exec setTimeout #3. // i = 10
16: exec setTimeout #4. // i = 10
17: exec setTimeout #5. // i = 10
18: exec setTimeout #6. // i = 10
19: exec setTimeout #7. // i = 10
20: exec setTimeout #8. // i = 10
21: exec setTimeout #9. // i = 10
22: exec setTimeout #10. // i = 10
當執行階段會發生,i
將已經10
要做到這一點是使用閉包的正確方式。他們通過打包變量的值來維護環境價值。
var i;
var print = function(i) {
console.log(i);
};
for (i = 0; i < 10; i++) {
(function (a) {
setTimeout(function() {
print(a);
}, 1000);
})(i);
}
這是因爲JavaScript事件循環。所有的setTimeout都堆放在事件循環隊列的末尾。一旦你的for循環完成(在我已經增加到10的時候),所有setTimeouts開始執行。因此,你總是看到10個打印。
n
從封閉中選取值。它在創建函數時包含值= 1,2,3 ...。
var i ;
var print = function(n){
console.log(n);
};
for(i = 0 ; i<10;i++){
setTimeout((function(n){
return function() {
print(n);
}
})(i),1000);
};
它做什麼它該做的,使用一段時間(){}循環,或爲了更好的理解做{} while()循環。 –
你想要做什麼?在循環結束時調用一次? –
@Praveen Kumar 一旦callstack被執行,然後執行setTimeout,就會在callstack的結尾調用setTimeout。有些開發人員將時間設置爲0毫秒setTimeout(print,0);只是爲了在最後立即執行一個函數。 –