js底層學(xué)習(xí)—js引擎 event loop機(jī)制

1、 js引擎是單線程的還是多線程的誓琼?

? ? ? ? ? 從表面看來,setTimeout()肴捉、ajax異步請求腹侣、回調(diào)函數(shù)這些js中比較重要的特性看起來是多線程的,但是js引擎卻是 單線程 的齿穗。時至今日傲隶,HTML5中已經(jīng)提出了web worker標(biāo)準(zhǔn),允許js腳本去創(chuàng)造多個線程窃页,但是這些線程中只有一個主線程跺株,而且其他線程都受主線程的控制,所以脖卖,js的本質(zhì)依然是單線程乒省。但是我們都知道,單線程只能在同一時間處理一件事務(wù)畦木,那么這一定會有效率差的問題袖扛,因?yàn)椋?dāng)前事務(wù)的處理十籍,一定會堵塞事件隊列中的其他事務(wù)的執(zhí)行蛆封。而某些耗時的io操作,比如鍵盤輸入勾栗,比如ajax于是js引入了 異步 的解決方案惨篱,采用了 event loop 機(jī)制去將耗時的io操作放入事件隊列(所謂 事件隊列 ,就是只有前一個事件執(zhí)行完畢围俘,后一個事件才會繼續(xù)執(zhí)行)中去妒蛇,先去執(zhí)行下一個事務(wù)操作机断,而那些放入到隊列中的耗時的io操作(比如ajax)在執(zhí)行完畢之后,javascript會將異步方法的執(zhí)行結(jié)果放入到事件隊列中绣夺,等待執(zhí)行。

? ? ? ? ?而正是因?yàn)閖avascript的非阻塞的io事件處理模型欢揖,node才最終選擇了js陶耍,大大推動了js在服務(wù)端的發(fā)展。

2她混、瀏覽器是多線程的

? ? ?js引擎線程只是瀏覽器中的一個線程烈钞。通常瀏覽器會有三個線程:js引擎線程、GUI線程(用于渲染視圖)坤按、瀏覽器時間觸發(fā)線程(用于用戶對瀏覽器的控制交互)

3毯欣、js引擎采用單線程機(jī)制,這和js的誕生有關(guān):

? ? ? js被創(chuàng)造出來用于實(shí)現(xiàn)操作瀏覽器html中的DOM樹臭脓、CSS樣式樹以及實(shí)現(xiàn)界面中用戶與html中DOM的動態(tài)交互酗钞,那么問題來了,假如js是多線程執(zhí)行来累,那么很可能出現(xiàn)同一時刻有兩個線程在操作同一個UI DOM元素砚作,并且假如一個線程用于給DOM元素添加樣式,而另一個線程用于刪除DOM元素嘹锁。這時候葫录,這個DOM就成為了 臨界資源,瀏覽器就無法去裁決究竟以哪一個線程的操作為準(zhǔn)领猾。雖然米同,我們也可以實(shí)現(xiàn)某些? 鎖 來規(guī)避這種線程操作互斥的情況,但是這一定會給js開發(fā)帶來更大的復(fù)雜性摔竿。所以js最終采用單線程機(jī)制面粮。

4、setTimeout()

? ? ? setTimeout()方法有兩個參數(shù)拯坟,第一個參數(shù)為一個 函數(shù)但金,第二個參數(shù)是一個時間。

? ? ?首先看這個代碼: ? setTimeout(function hello(),1000);

? ? ?內(nèi)部的運(yùn)行順序:在js引擎執(zhí)行完該行js代碼之后郁季,會在1000毫秒之后會把hello()這個函數(shù)放入到事件隊列中冷溃。等到事件隊列中排在hello()之前的任務(wù)執(zhí)行完畢后,hello()得到執(zhí)行梦裂。所以setTimeout方法中設(shè)置的時間為1000毫秒似枕,只是說明在setTimeout()方法運(yùn)行之后的1000毫秒時,把setTimeout方法的第一個參數(shù):hello()函數(shù)放入到事件隊列中準(zhǔn)備執(zhí)行年柠。注意凿歼,這里是準(zhǔn)備執(zhí)行,而不是立即執(zhí)行。所以答憔,在setTimeout()方法執(zhí)行后味赃,到hello()執(zhí)行的 ?時間差 總是大于1000毫秒的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末虐拓,一起剝皮案震驚了整個濱河市心俗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蓉驹,老刑警劉巖城榛,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異态兴,居然都是意外死亡狠持,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門瞻润,熙熙樓的掌柜王于貴愁眉苦臉地迎上來喘垂,“玉大人,你說我怎么就攤上這事敢订⊥跷郏” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵楚午,是天一觀的道長昭齐。 經(jīng)常有香客問我,道長矾柜,這世上最難降的妖魔是什么阱驾? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮怪蔑,結(jié)果婚禮上里覆,老公的妹妹穿的比我還像新娘。我一直安慰自己缆瓣,他們只是感情好喧枷,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著弓坞,像睡著了一般隧甚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上渡冻,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天戚扳,我揣著相機(jī)與錄音,去河邊找鬼族吻。 笑死帽借,一個胖子當(dāng)著我的面吹牛珠增,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播砍艾,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼蒂教,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了脆荷?” 一聲冷哼從身側(cè)響起悴品,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎简烘,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體定枷,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡孤澎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了欠窒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片覆旭。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖岖妄,靈堂內(nèi)的尸體忽然破棺而出型将,到底是詐尸還是另有隱情,我是刑警寧澤荐虐,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布七兜,位于F島的核電站,受9級特大地震影響福扬,放射性物質(zhì)發(fā)生泄漏腕铸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一铛碑、第九天 我趴在偏房一處隱蔽的房頂上張望狠裹。 院中可真熱鬧,春花似錦汽烦、人聲如沸涛菠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽俗冻。三九已至,卻和暖如春梢夯,著一層夾襖步出監(jiān)牢的瞬間言疗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工颂砸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留噪奄,地道東北人死姚。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像勤篮,于是被迫代替她去往敵國和親都毒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容