千鋒教育web前端高頻面試題視頻教程,kerwin大話前端面試秘籍(附答案)

同步&異步
1、同步任務(wù)
同步任務(wù)指的是,在主線程上排隊(duì)執(zhí)行的任務(wù),只有前一個(gè)任務(wù)執(zhí)行完畢,才能執(zhí)行后一個(gè)任務(wù);
2、異步任務(wù)
異步任務(wù)指的是,不進(jìn)入主線程、而進(jìn)入"任務(wù)隊(duì)列"(task queue)的任務(wù),只有等主線程任務(wù)執(zhí)行完畢,"任務(wù)隊(duì)列"開(kāi)始通知主線程,請(qǐng)求執(zhí)行任務(wù),該任務(wù)才會(huì)進(jìn)入主線程執(zhí)行。
3、js異步操作包括:
- 定時(shí)器
- 事件綁定
- 回調(diào)函數(shù)可以理解為異步(不是嚴(yán)謹(jǐn)?shù)漠惒讲僮鳎?/li>
- AJAX中一般我們都采取異步操作(也可以同步)
- new Promise中的resolve()
4、同步和異步運(yùn)行機(jī)制
- 有同步任務(wù)都在主線程上執(zhí)行,形成一個(gè)執(zhí)行棧(execution context stack)。
- 主線程之外,還存在一個(gè)"任務(wù)隊(duì)列"(task queue)。只要異步任務(wù)有了運(yùn)行結(jié)果,就在"任務(wù)隊(duì)列"之中放置一個(gè)事件。
- 一旦"執(zhí)行棧"中的所有同步任務(wù)執(zhí)行完畢,系統(tǒng)就會(huì)讀取"任務(wù)隊(duì)列",看看里面有哪些事件。那些對(duì)應(yīng)的異步任務(wù),于是結(jié)束等待狀態(tài),進(jìn)入執(zhí)行棧,開(kāi)始執(zhí)行。
- 主線程不斷重復(fù)上面的第三步。只要主線程空了,就會(huì)去讀取"任務(wù)隊(duì)列",這就是JavaScript的運(yùn)行機(jī)制。這個(gè)過(guò)程會(huì)不斷重復(fù)。
事件循環(huán)
簡(jiǎn)單來(lái)說(shuō),JS 的事件循環(huán)(Event Loop)機(jī)制,決定了什么時(shí)候該執(zhí)行哪一行代碼。雖然 JS 是單線程的,但瀏覽器是多線程的,所以 JS 借助瀏覽器提供的能力,實(shí)現(xiàn)了 JS 的異步編程(比如 setTimeout 方法)。如果沒(méi)有 JS 事件循環(huán),則當(dāng)瀏覽器執(zhí)行一段耗時(shí)的 JS 同步代碼時(shí),就沒(méi)有辦法及時(shí)響應(yīng)用戶的其他操作,從而給用戶帶來(lái)不好的體驗(yàn)。
- 事件循環(huán)負(fù)責(zé)收集事件(如mousemove、setTimeout等),并對(duì)事件觸發(fā)的回調(diào)任務(wù)進(jìn)行排隊(duì)以便在合適的時(shí)候執(zhí)行。先執(zhí)行宏任務(wù),然后是微任務(wù),然后在開(kāi)始下一次循環(huán)之前執(zhí)行一些必要的渲染,如此循環(huán)往復(fù)。
JS 的事件循環(huán)主要由這幾部分組成:調(diào)用棧、web API、微任務(wù)隊(duì)列、宏任務(wù)隊(duì)列調(diào)用棧
JS 調(diào)用棧(Call Stack)是一個(gè)用于記錄函數(shù)調(diào)用的數(shù)據(jù)結(jié)構(gòu),它遵循先進(jìn)后出的原則(LIFO)。當(dāng)一個(gè)函數(shù)被調(diào)用時(shí),它的執(zhí)行上下文(包括函數(shù)參數(shù)、局部變量等)被添加到調(diào)用棧的頂部。當(dāng)函數(shù)執(zhí)行完畢時(shí),它的執(zhí)行上下文被從調(diào)用棧中彈出,控制權(quán)回到調(diào)用該函數(shù)的上一個(gè)執(zhí)行上下文。
web API
JS 的 Web API 是瀏覽器提供的一組 API,用于與瀏覽器環(huán)境交互,包括 DOM、XMLHttpRequest、Fetch、setTimeout 等。這些 API 不是 JS 語(yǔ)言本身的一部分,而是瀏覽器提供的擴(kuò)展,通過(guò)這些 API 可以讓 JS 與瀏覽器環(huán)境進(jìn)行交互。
微任務(wù)宏任務(wù)
微任務(wù)隊(duì)列
微任務(wù)隊(duì)列用于存放微任務(wù),它遵循先進(jìn)先出的原則(FIFO)。當(dāng)一個(gè)微任務(wù)被調(diào)度時(shí),它被添加到微任務(wù)隊(duì)列的末端,排隊(duì)等待 JS 主線程的執(zhí)行。
宏任務(wù)隊(duì)列
宏任務(wù)隊(duì)列用于存放宏任務(wù),它遵循先進(jìn)先出的原則(FIFO)。當(dāng)一個(gè)宏任務(wù)被調(diào)度時(shí),它被添加到宏任務(wù)隊(duì)列的末端,排隊(duì)等待 JS 主線程的執(zhí)行。