国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

一道面試題引發(fā)的思考 --- Event Loop

betacat / 3288人閱讀

摘要:想必面試題刷的多的同學(xué)對(duì)下面這道題目不陌生,能夠立即回答出輸出個(gè),可是你真的懂為什么嗎為什么是輸出為什么是輸出個(gè)這兩個(gè)問題在我腦邊縈繞。同步任務(wù)都好理解,一個(gè)執(zhí)行完執(zhí)行下一個(gè)。本文只是我對(duì)這道面試題的一點(diǎn)思考,有誤的地方望批評(píng)指正。

想必面試題刷的多的同學(xué)對(duì)下面這道題目不陌生,能夠立即回答出輸出10個(gè)10,可是你真的懂為什么嗎?為什么是輸出10?為什么是輸出10個(gè)10?這兩個(gè)問題在我腦邊縈繞。嗯,我得說服自己。

for (var i = 0; i < 10; i++) {
  setTimeout(() => {
    console.log(i)
  }, 0)
}

JavaScript 是單線程。(ok,我又問自己它為什么是單線程 ==》作為瀏覽器語言,JS的用途是與用戶交互以及操作DOM,如果是多線程會(huì)引發(fā)很多問題,瀏覽器無法判斷以哪個(gè)線程為標(biāo)準(zhǔn),因此它只能是單線程)
任務(wù)分為「同步任務(wù)」與「異步任務(wù)」。同步任務(wù)都好理解,一個(gè)執(zhí)行完執(zhí)行下一個(gè)。異步任務(wù)稍許復(fù)雜。
異步任務(wù)運(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í)行完,就會(huì)去讀取任務(wù)隊(duì)列的事件,異步任務(wù)事件結(jié)束等待狀態(tài),進(jìn)入執(zhí)行棧執(zhí)行

主線程重復(fù)前面三步

其實(shí)屢清楚很好理解,以上運(yùn)行機(jī)制又稱為 Event Loop(事件循環(huán))
我們回到這道面試題, 一起來理解下:

for 循環(huán)是同步任務(wù),setTimeout 是異步任務(wù)
首先 for 循環(huán)在主線程上執(zhí)行,setTimeout 進(jìn)入任務(wù)隊(duì)列
同步任務(wù)執(zhí)行完,i = 10,此時(shí) setTimeout 被喚醒進(jìn)入執(zhí)行棧執(zhí)行
因此輸出的值為10
可是為什么會(huì)輸出10個(gè)10呢?到現(xiàn)在我還是沒有完全說服自己。

我們對(duì)代碼稍作修改,

for (var i = 0; i < 10; i++) {
  console.log(i)
  var p = setTimeout(() => {
    console.log(i)
  }, 0)
  console.log(p)
}

輸出結(jié)果

0
Timeout {_called: false, _idleTimeout: 1, _idlePrev: TimersList, _idleNext: TimersList, _idleStart: 1893, …}
1
Timeout {_called: false, _idleTimeout: 1, _idlePrev: TimersList, _idleNext: Timeout, _idleStart: 3739, …}
2
Timeout {_called: false, _idleTimeout: 1, _idlePrev: TimersList, _idleNext: Timeout, _idleStart: 4924, …}
......
9
Timeout {_called: false, _idleTimeout: 1, _idlePrev: TimersList, _idleNext: Timeout, _idleStart: 11733, …}
10
10
...
10

看到這個(gè)結(jié)果大家是否有些清楚了呢,我們重新梳理下原先的面試題

首先 for 循環(huán)在主線程上執(zhí)行,setTimeout 內(nèi)部的回調(diào)函數(shù)進(jìn)入任務(wù)隊(duì)列
for 循環(huán)里,i 每次執(zhí)行一次,異步隊(duì)列里放置一個(gè) setTimeout 回調(diào)
同步任務(wù)執(zhí)行完,i = 10, 此時(shí)異步隊(duì)列里放置了10個(gè)回調(diào)事件
setTimeout 被喚醒進(jìn)入執(zhí)行棧執(zhí)行
因此輸出了10個(gè)10

當(dāng)然了, Event Loop 的知識(shí)不止這點(diǎn),涉及到的東西也很多。本文只是我對(duì)這道面試題的一點(diǎn)思考,有誤的地方望批評(píng)指正。

以下幾篇是我收藏的好文,供大家學(xué)習(xí)參考~
JavaScript 運(yùn)行機(jī)制詳解:再談Event Loop
這一次,徹底弄懂 JavaScript 執(zhí)行機(jī)制
從event loop規(guī)范探究javaScript異步及瀏覽器更新渲染時(shí)機(jī)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/100294.html

相關(guān)文章

  • 面試不倒翁:一道事件循環(huán)引發(fā)血案

    摘要:通過查看的文檔可以發(fā)現(xiàn)整個(gè)分為個(gè)階段定時(shí)器相關(guān)任務(wù),中我們關(guān)注的是它會(huì)執(zhí)行和中到期的回調(diào)執(zhí)行某些系統(tǒng)操作的回調(diào)內(nèi)部使用執(zhí)行,一定條件下會(huì)在這個(gè)階段阻塞住執(zhí)行的回調(diào)如果或者關(guān)閉了,就會(huì)在這個(gè)階段觸發(fā)事件,執(zhí)行事件的回調(diào)的代碼在文件中。 showImg(https://segmentfault.com/img/bVbd7B7?w=1227&h=644); 這次我們就不要那么多前戲,直奔主題...

    ispring 評(píng)論0 收藏0
  • 一道前端面試引發(fā)思考

    摘要:直接開始題目是厲害了說句實(shí)話開發(fā)中誰寫成這樣保證會(huì)被打死。不過面試就是面試,有面試官的考量點(diǎn)。官方是這么說的。結(jié)果完美,不過小姐姐的意思是數(shù)組的方法會(huì)自動(dòng)觸發(fā)數(shù)組的。 直接開始題目是 if(a==1 && a==2 && a==3){ alert(厲害了) } 說句實(shí)話開發(fā)中誰寫成這樣保證會(huì)被打死。 不過面試就是面試,有面試官的考量點(diǎn)。 我理解的點(diǎn)有兩個(gè) 1、隱式類型轉(zhuǎn)換 先說...

    gaomysion 評(píng)論0 收藏0
  • 「今日頭條」前端面試和思路解析

    摘要:一篇文章和一道面試題最近,有篇名為張圖幫你一步步看清和的執(zhí)行順序的文章引起了我的關(guān)注。作者用一道年今日頭條的前端面試題為引子,分步講解了最終結(jié)果的執(zhí)行原因。從字面意思理解,讓我們等等。當(dāng)前的最新版本,在這里的執(zhí)行順序上,的確存在有問題。 一篇文章和一道面試題 最近,有篇名為 《8張圖幫你一步步看清 async/await 和 promise 的執(zhí)行順序》 的文章引起了我的關(guān)注。 作者用...

    寵來也 評(píng)論0 收藏0
  • 一道簡(jiǎn)單面試引發(fā)思考

    摘要:另一個(gè)問題,就是我下面要提及的作用域問題,我當(dāng)時(shí)思考的時(shí)間太久了這是回憶中的面試題實(shí)際略有差異,不糾結(jié)了說一下腳本的運(yùn)行結(jié)果引用錯(cuò)誤中給出的錯(cuò)誤提示。 版權(quán)聲明:此文首發(fā)于我的簡(jiǎn)書賬號(hào)人生還有多少個(gè)二十年,轉(zhuǎn)載請(qǐng)注明出處。 此處有幾百字嘮叨:   當(dāng)天,我早早起床,跨越上百公里,高德導(dǎo)航,路人指點(diǎn),跌跌撞撞到達(dá)招聘會(huì)現(xiàn)場(chǎng),當(dāng)時(shí)已是中午十二點(diǎn)半,吃了午餐(半瓶白開水),開始準(zhǔn)備投遞...

    wpw 評(píng)論0 收藏0
  • 鏈?zhǔn)秸{(diào)用與事件循環(huán)--一道JavaScript面試思考

    摘要:最后畫幾張粗糙的圖,簡(jiǎn)單描述一下這個(gè)執(zhí)行的過程因?yàn)槭擎準(zhǔn)秸{(diào)用,所以在鏈上的都會(huì)入棧然后執(zhí)行,額,執(zhí)行棧少畫了和。。。 前言:昨天在群里討(jin)論(chui)技(niu)術(shù)(pi),有位老鐵發(fā)了一道他面的某公司面試題,順手保存了。今早花了一點(diǎn)時(shí)間把這題做了出來,發(fā)現(xiàn)挺有意思的,決定在今天認(rèn)真工(hua)作(shui)前,與大家分享我的解題方案和思考過程。 題目如下(可以自己先思考一會(huì)...

    wow_worktile 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<