1. 程式人生 > >setTimeout(fn,0)

setTimeout(fn,0)

零延時

  • 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)的使用