国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

如何通過setTimeout理解JS運行機制詳解

2024-05-06 15:41:26
字體:
來源:轉載
供稿:網友


setTimeout()函數:用來指定某個函數或某段代碼在多少毫秒之后執行。它返回一個整數,表示定時器timer的編號,可以用來取消該定時器。

例子

console.log(1);setTimeout(function () { console.log(2);}, 0);console.log(3);

問:最后的打印順序是什么?(如果不了解js的運行機制就會答錯)

正確答案:1 3 2

解析:無論setTimeout的執行時間是0還是1000,結果都是先輸出3后輸出2,這就是面試官常??疾榈膉s運行機制的問題,接下來我們要引入一個概念,JavaScript 是單線程的。

二、 JavaScript 單線程

JavasScript引擎是基于事件驅動和單線程執行的,JS引擎一直等待著任務隊列中任務的到來,然后加以處理,瀏覽器無論什么時候都只有一個JS線程在運行程序,即主線程。

通俗的說:JS在同一時間內只能做一件事,這也常被稱為 “阻塞式執行”。

任務隊列

那么單線程的JavasScript是怎么實現“非阻塞執行”呢?

答:異步容易實現非阻塞,所以在JavaScript中對于耗時的操作或者時間不確定的操作,使用異步就成了必然的選擇。
諸如事件點擊觸發回調函數、ajax通信、計時器這種異步處理是如何實現的呢?

答:任務隊列

所有任務可以分成兩種,一種是同步任務(synchronous),另一種是異步任務(asynchronous)。

任務隊列:一個先進先出的隊列,它里面存放著各種事件和任務。

同步任務

同步任務:在主線程上排隊執行的任務,只有前一個任務執行完畢,才能執行后一個任務。

輸出 如:console.log() 變量的聲明 同步函數:如果在函數返回的時候,調用者就能夠拿到預期的返回值或者看到預期的效果,那么這個函數就是同步的。

異步任務

setTimeout和setInterval DOM事件 Promise process.nextTick fs.readFile http.get 異步函數:如果在函數返回的時候,調用者還不能夠得到預期結果,而是需要在將來通過一定的手段得到,那么這個函數就是異步的。

除此之外,任務隊列又分為macro-task(宏任務)與micro-task(微任務),在ES5標準中,它們被分別稱為task與job。

宏任務

    I/O setTimeout setInterval setImmdiate requestAnimationFrame

微任務

    process.nextTick Promise Promise.then MutationObserver

宏任務和微任務的執行順序

一次事件循環中,先執行宏任務隊列里的一個任務,再把微任務隊列里的所有任務執行完畢,再去宏任務隊列取下一個宏任務執行。

注:在當前的微任務沒有執行完成時,是不會執行下一個宏任務的。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 林芝县| 漳州市| 大连市| 桃园市| 宁化县| 云安县| 璧山县| 云龙县| 遵义县| 郁南县| 安阳市| 沾化县| 甘洛县| 石阡县| 鄂伦春自治旗| 石景山区| 新乐市| 龙川县| 靖宇县| 普定县| 琼结县| 长治县| 察隅县| 盈江县| 张掖市| 阿图什市| 高平市| 鹿泉市| 墨竹工卡县| 乌鲁木齐县| 搜索| 玛多县| 施秉县| 尤溪县| 宁远县| 汉中市| 阳朔县| 分宜县| 太和县| 分宜县| 西吉县|