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

首頁(yè) > 語言 > JavaScript > 正文

javascript中的event loop事件循環(huán)詳解

2024-05-06 15:27:17
字體:
供稿:網(wǎng)友

前言

javascript是單線程的語言,也就是說,同一個(gè)時(shí)間只能做一件事。而這個(gè)單線程的特性,與它的用途有關(guān),作為瀏覽器腳本語言,JavaScript的主要用途是與用戶互動(dòng),以及操作DOM。這決定了它只能是單線程,否則會(huì)帶來很復(fù)雜的同步問題。比如,假定JavaScript同時(shí)有兩個(gè)線程,一個(gè)線程在某個(gè)DOM節(jié)點(diǎn)上添加內(nèi)容,另一個(gè)線程刪除了這個(gè)節(jié)點(diǎn),這時(shí)瀏覽器應(yīng)該以哪個(gè)線程為準(zhǔn)?

為了利用多核CPU的計(jì)算能力,HTML5提出Web Worker標(biāo)準(zhǔn),允許JavaScript腳本創(chuàng)建多個(gè)線程,但是子線程完全受主線程控制,且不得操作DOM。所以,這個(gè)新標(biāo)準(zhǔn)并沒有改變JavaScript單線程的本質(zhì)

這是今天一個(gè)朋友發(fā)給我的一個(gè)面試題,

感覺還挺有意思的,

寫個(gè)博客以供分享

先看看這個(gè)面試題目:

觀察下面的代碼,寫出輸出結(jié)果

console.log('0')setTimeout(function () { console.log('1');});new Promise(function(resolve,reject){ console.log('2') resolve(3)}).then(function(val){ console.log(val)})console.log(4)

輸出結(jié)果: “0” “2” 4 3 “1”

今天主要是分析為什么輸出結(jié)果是這樣的?這就和 javascript 的執(zhí)行機(jī)制密切相關(guān)了.

Event Queue 和 Event Loop

javascript 是一門單線程的語言, 這就意味著在執(zhí)行代碼的時(shí)候, 都只有一個(gè)主線程來處理所有的任務(wù).

我們都知道 javascript 包括同步代碼和異步代碼, 那么 javascript 是怎么處理這兩種情況的呢?

同步和異步任務(wù)分別進(jìn)入不同的執(zhí)行 場(chǎng)所, 同步的進(jìn)入主線程,異步的進(jìn)入 Event Table 并注冊(cè)函數(shù) 當(dāng)指定的事情完成時(shí), Event Table 會(huì)將這個(gè)函數(shù)(回調(diào)函數(shù))移入 Event Queue 主線程內(nèi)的任務(wù)執(zhí)行完畢為空, 會(huì)去 Event Queue 讀取對(duì)應(yīng)的函數(shù),進(jìn)入主線程執(zhí)行 上述過程會(huì)不斷重復(fù), 也就是常說的 Event Loop(事件循環(huán))

這里我們引進(jìn)了 Event Queue 事件隊(duì)列這一概念. 所有異步操作的回調(diào)都會(huì)進(jìn)入到這里. 然后等到主線程空閑, 就會(huì)從這里調(diào)取回調(diào)執(zhí)行.

setTimeout

setTimeout 相信大家都有使用過, 可以延時(shí)執(zhí)行并且是異步執(zhí)行的.

但是有時(shí)候我們得到的結(jié)果往往是代碼實(shí)際執(zhí)行的時(shí)間比我們想要延時(shí)執(zhí)行的時(shí)間要久。這又是為什么呢?

這就和我們之前所說的 Event Loop 有關(guān)了, 我們可以來具體看下 setTimeout 的執(zhí)行步驟:

setTimeout(function () {asyncFn()}, 1000);syncFn()
asyncFn 將異步執(zhí)行函數(shù)放在 Event Table, 并且開始計(jì)時(shí) 開始執(zhí)行 syncFn, 但是 syncFn 可能需要處理的內(nèi)容很多, 執(zhí)行時(shí)間超過 1 秒, 但是計(jì)時(shí)還在繼續(xù) 計(jì)時(shí)到達(dá) 1 秒, setTimeout 延時(shí)完成, asyncFn 進(jìn)入 Event Queue 事件隊(duì)列, 但是主線程還在執(zhí)行, 所以只能等待 syncFn 執(zhí)行完成, 此時(shí) asyncFn 從事件隊(duì)列中進(jìn)入主線程執(zhí)行
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 忻州市| 富平县| 周口市| 会昌县| 故城县| 竹溪县| 深水埗区| 志丹县| 井陉县| 山阳县| 丰镇市| 黄平县| 大连市| 乐昌市| 和田县| 庆城县| 高碑店市| 大名县| 石景山区| 东丰县| 响水县| 防城港市| 名山县| 雅安市| 寻乌县| 沛县| 高雄市| 应城市| 呼图壁县| 遂溪县| 赞皇县| 永嘉县| 开阳县| 承德市| 浦东新区| 吴旗县| 醴陵市| 宁陵县| 绩溪县| 清丰县| 清流县|