發布時間:2024-01-24閱讀(12)

今天有事外出,所以就挑簡單的來討論 ——
定時器 setTimeout
定時器在面試題中經常出現,都是搭配來考察其他相關知識的。
定時器下列代碼會在控制臺輸出什么?

點擊下面小程序可以瀏覽完整題目和選項。
上面是一道經典的題目,主要用于考察 JavaScript 的作用域和事件隊列。
當執行 for 循環時候,調用 setTimeout 異步函數,將其中的回調函數推到事件隊列中等待執行。
此時回調函數的執行時間,被設定為從 0s 到 4s。
又因為通過 var 聲明的 i 變量并不是在 for 循環中,而是在聲明的方法體內,在例子中是則是在全局作用域。
所以在 for 循環執行結束后,全局作用域的 i = 5
而到隊列任務執行時,所有隊列任務中執行的 console.log(i) 中都是訪問全局函數中的 i。
所以結果就是:每隔 1 秒,控制臺輸出一個 5。
閉包而想按順序輸出 1 到 5,以前會使用閉包。

上面通過聲明一個自執行的匿名函數,當循環時候,創建出 5 個閉包,每個閉包內的變量 i是循環時傳進去的 i 值。
當隊列任務被調用時,console.log(i) 為對應的閉包內的變量 i。
let在 ES6 中,通過關鍵字 let,可以創建出塊級作用域。產生和閉包一樣的效果。

觀察下列代碼,控制臺會怎樣的輸出呢?

控制臺會立即輸出 0 至 4。而不是間隔 1 秒輸出 0 到 4。
因為 console.log(i) 已經是調用函數的形式,而不是一個函數句柄。所以在執行循環時候,就同時執行 console.log(i)。
那么,應該怎樣修改呢?

setTimeout() 首個參數接收回調函數,第二個參數接收延時時間。
我們可能會忽略,setTimeout() 的后續參數都是作為附加參數,在定時器到期時候,傳到回調函數中。
所以,只需要在附加參數中傳進 i 即可。
結語今天的內容較為簡單,可能很多朋友都已經了解。這些都算是面試中的開胃菜,不得不會,千萬別陰溝里翻船。
覺得不錯的幫忙點個贊吧,歡迎評論區討論。
歡迎分享轉載→http://www.avcorse.com/read-234942.html
Copyright ? 2024 有趣生活 All Rights Reserve吉ICP備19000289號-5 TXT地圖HTML地圖XML地圖