A
for (var i=5; i>=1; i--) {
setTimeout( function timer() {
document.write(i+"<br />");
}, i*3000 );
}
// 0 0 0 0 0
// 保存执行后,3秒后弹出第一个console(0),之后隔3秒弹出第二个,依次按照时间执行。
A2
for (var i=1; i<6; i++) {
setTimeout( function timer() {
console.log(i);
}, i*3000 );
}
// 6 6 6 6 6
// 保存执行后,3秒后弹出第一个console(6),之后每隔3秒弹出一个,依次按照时间执行。
B
for (var i=5; i>=1; i--) {
setTimeout( function timer() {
document.write(i+"<br />");
}, 3000 );
}
// 0 0 0 0 0
// 保存执行后,3秒后所有的console一齐弹出
C(採用閉包)
for (var i=5; i>0; i--) {
!function (num) {
setTimeout( function timer() {
console.log(num);
}, i*3000 );
}(i)
}
// 1 2 3 4 5 每隔3秒依次弹出
i*3000
,i
值為多少? (1?),為什麼時間依舊是3000,沒有和i
值一齊計算? 包含採用閉包後(C),依舊是每隔3000ms彈出。
i*3000
和3000
,console
彈出的差異,這個差異在C閉包上也有體現。為什麼會造成這樣區別? 之前看到JS的佇列執行結構,知道setTimeout這類函數是須等其他程式碼執行完畢後才開始執行,且存在多個setTimeout的話,按照時間設定長短,分配優先權(設定時間短的在前)。這裡實在不知道為什麼會有這樣的差別,對它還是摸不透- -
for (var i=1;i<6;i++) {
!function (num) {
setTimeout( function timer() {
console.log(num);
}, num*3000 );
}(i)
}
console
,去掉num*
則一齊彈出。相乘運算難道沒執行?
setTimeout
每隔3000ms彈出一個的話,時間不應該是3000,6000,9000,12000嗎,你是不是跟setInterval
搞混了。接著再說一點setTimeout(fn,time),這是個函數的執行,setTimeout的創建與主js是同步的(這個時候time的值就已經確定了),異步的是其中的fn的執行(執行的時候再去找內部的
i
或num
才會收閉包等的影響)。站內搜尋event loop js應該有很多重複的問題和解釋。
setTimeout
的延遲是相對於你運行它的那一刻,你這個for
循環一股腦的把延遲全部設定好了,第一個相對當前3秒,第二個相對當前是6秒,第三個是9秒……以此類推。最後體現出來不就是每隔3秒一個輸出嗎…