javascript
JavaScript相关面试题:setTimeout的运行机制
文章目錄
- setTimeout簡介
- JavaScript 單線程
- setTimeout運行機制
setTimeout簡介
setTimeout()函數(shù):用來指定某個函數(shù)或某段代碼在多少毫秒之后執(zhí)行。它返回一個整數(shù),表示定時器timer的編號,可以用來取消該定時器。
console.log(1); setTimeout(function () {console.log(2); }, 0); console.log(3)//1 3 2無論setTimeout的執(zhí)行時間是0還是1000,結(jié)果都是先輸出3后輸出2,這就是面試官常常考查的js運行機制的問題
JavaScript 單線程
JavasScript引擎是基于事件驅(qū)動和單線程執(zhí)行的,JS引擎一直等待著任務(wù)隊列中任務(wù)的到來,然后加以處理,瀏覽器無論什么時候都只有一個JS線程在運行程序,即主線程。那么單線程的JavasScript是怎么實現(xiàn)“非阻塞執(zhí)行”呢?是通過任務(wù)隊列。
所有任務(wù)可以分成兩種,一種是同步任務(wù)(synchronous),另一種是異步任務(wù)(asynchronous)。
單線程就意味著,所有任務(wù)需要排隊,前一個任務(wù)結(jié)束,才會執(zhí)行后一個任務(wù)。如果前一個任務(wù)耗時很長,后一個任務(wù)就不得不一直等著。但是如果有些任務(wù)很慢時(比如Ajax操作從網(wǎng)絡(luò)讀取數(shù)據(jù)),我還是要等結(jié)果在執(zhí)行后一個任務(wù)嗎?于是,有了一種異步任務(wù)。
同步任務(wù)指的是,在主線程上排隊執(zhí)行的任務(wù),只有前一個任務(wù)執(zhí)行完畢,才能執(zhí)行后一個任務(wù);而異步任務(wù)指的是,不進入主線程、而進入"任務(wù)隊列"(task queue)的任務(wù),只有主線程執(zhí)行完畢,主線程去通知"任務(wù)隊列",某個異步任務(wù)可以執(zhí)行了,該任務(wù)才會進入主線程執(zhí)行。
★所有同步任務(wù)都在主線程上執(zhí)行,形成一個執(zhí)行棧(Call Stack)
★主線程之外,還存在一個"任務(wù)隊列"(task queue)。只要異步任務(wù)有了運行結(jié)果,就在"任務(wù)隊列"之中放置一個事件
★一旦"執(zhí)行棧"中的所有同步任務(wù)執(zhí)行完畢,系統(tǒng)就會讀取"任務(wù)隊列",看看里面有哪些事件。那些對應(yīng)的異步任務(wù),于是結(jié)束等待狀態(tài),進入執(zhí)行棧,開始執(zhí)行。
★主線程不斷重復(fù)上面的第三步
setTimeout運行機制
setTimeout 和 setInterval的運行機制,其實就是將指定的代碼移出本次執(zhí)行,等到下一輪 Event Loop 時,再檢查是否到了指定時間。如果到了,就執(zhí)行對應(yīng)的代碼;如果不到,就等到再下一輪 Event Loop 時重新判斷。
這意味著,setTimeout指定的代碼,必須等到本次執(zhí)行的所有同步代碼都執(zhí)行完,才會執(zhí)行。
總結(jié)
以上是生活随笔為你收集整理的JavaScript相关面试题:setTimeout的运行机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SAP 理解期末清帐和重分类
- 下一篇: 算法编程JS控制台输入总结(V8和nod