setTimeout(fn,0)
阿新 • • 發佈:2018-12-09
零延時
- setTimeout(fn,0)會將fn新增到當前事件佇列(訊息佇列)的最後,等待事件迴圈的處理
- 所謂事件佇列的最後是指當前所有同步任務的最後
- 零延遲並不是意味著回撥會立即執行。在零延遲呼叫 setTimeout 時,其並不是過了給定的時間間隔後就馬上執行回撥函式。其等待的時間基於佇列里正在等待的訊息數量。延遲是要求執行時處理請求所需的最小時間,但不是有所保證的時間。MDN-零延時
const fnTest = () => {
for(i=0;i<3;i++){
setTimeout(() => {
console. log('time', i)
}, 0)
console.log('i', i)
}
}
fnTest() //012333
console.log('window', i) //012(i) 3(window) 333(time)
const letTest = () => {
for(let i=0; i<3;i++) {
setTimeout(()=>console.log('let-time', i),0)
console.log('let-i', i)
}
}
letTest() //012(i) window 012(let-i) 333(time) 012(let-time)
let塊級作用域
- fnTest中使用var宣告變數i,這時i是全域性有效的,全域性只有一個變數i,console.log(‘window’,i)也可以證明這一點,在console.log(‘time’,i)執行時i 的值已經是3所以每次輸出都是3
- 在letTest函式中使用let宣告變數i,每次迴圈中的i都是一個新的變數,所以輸出的是012而不是333
- 可以參考另一篇文章JS塊級作用域與函式作用域–ES6 let
待更新:setTimeout(fn,0)的使用