摘要:定時(shí)器機(jī)制更正之前的錯(cuò)誤認(rèn)識(shí)函數(shù)內(nèi)調(diào)用,函數(shù)結(jié)束。在規(guī)定的時(shí)間之后,依然會(huì)觸發(fā)的回調(diào)。首先要確認(rèn)幾點(diǎn)單線程瀏覽器多線程單線程原因如果多線程,那么刪除或者創(chuàng)建元素,都需要在線程之間通信。因?yàn)闉g覽器不確定是狀態(tài)。所以,設(shè)計(jì)之初就是單線程。
js定時(shí)器機(jī)制
更正之前的錯(cuò)誤認(rèn)識(shí):
1.函數(shù)內(nèi)調(diào)用settimeout,函數(shù)結(jié)束。在規(guī)定的時(shí)間之后,依然會(huì)觸發(fā)settimeout的回調(diào)。
首先要確認(rèn)js幾點(diǎn):
1.js單線程 vs 瀏覽器多線程:
單線程原因:如果多線程,那么刪除或者創(chuàng)建dom元素,都需要在線程之間通信。因?yàn)闉g覽器不確定是dom狀態(tài)。所以,js設(shè)計(jì)之初就是單線程。
好處:簡(jiǎn)單,沒(méi)有線程切換維護(hù)開(kāi)銷,省內(nèi)存
2.瀏覽器是多線程:
javascript引擎線程
界面渲染線程
瀏覽器事件觸發(fā)線程
Http請(qǐng)求線程
但是瀏覽器內(nèi)核是多線程!瀏覽器內(nèi)核實(shí)現(xiàn)允許多個(gè)線程異步執(zhí)行,這些線程在內(nèi)核制控下相互配合以保持同步.假如某一瀏覽器內(nèi)核的實(shí)現(xiàn)至少有三個(gè)常駐線程:javascript引擎線程,界面渲染線程,瀏覽器事件觸發(fā)線程,除些以外,也有一些執(zhí)行完就終止的線程,如Http請(qǐng)求線程,這些異步線程都會(huì)產(chǎn)生不同的異步事件,下面通過(guò)一個(gè)圖來(lái)闡明單線程的JavaScript引擎與另外那些線程是怎樣互動(dòng)通信的.雖然每個(gè)瀏覽器內(nèi)核實(shí)現(xiàn)細(xì)節(jié)不同,但這其中的調(diào)用原理都是大同小異.
定時(shí)器難點(diǎn):
1.定時(shí)器實(shí)際延時(shí)時(shí)間,是無(wú)法預(yù)知的
理解js異步回調(diào)和它的單線程是如何配合工作的:
為什么settimeout會(huì)觸發(fā)回調(diào) ajax回調(diào) click回調(diào)
參考資料:http://www.laruence.com/2009/09/23/1089.html
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/91616.html
摘要:由于引擎同一時(shí)間只執(zhí)行一段代碼這是由單線程的性質(zhì)決定的,所以每個(gè)代碼塊阻塞了其它異步事件的進(jìn)行。這意味著瀏覽器將等待著一個(gè)新的異步事件發(fā)生。異步的任務(wù)執(zhí)行的順序是不固定的,主要看返回的速度。 我們經(jīng)常說(shuō)JS是單線程的,比如node.js研討會(huì)上大家都說(shuō)JS的特色之一是單線程的,這樣使JS更簡(jiǎn)單明了,可是大家真的理解所謂JS的單線程機(jī)制嗎?單線程時(shí),基于事件的異步機(jī)制又該當(dāng)如何,這些知識(shí)...
摘要:在異步機(jī)制中,任務(wù)隊(duì)列就是用來(lái)維護(hù)異步任務(wù)回調(diào)函數(shù)的隊(duì)列。四對(duì)象對(duì)象是工作組提出的一種規(guī)范,目的是為異步編程提供統(tǒng)一接口。 異步 1.JavaScript單線程的理解 Javascript語(yǔ)言的執(zhí)行環(huán)境是單線程(single thread)。所謂單線程,就是指一次只能完成一件任務(wù)。如果有多個(gè)任務(wù),就必須排隊(duì),前面一個(gè)任務(wù)完成,再執(zhí)行后面一個(gè)任務(wù),以此類推。 2.JavaScript單線...
摘要:線程機(jī)制與事件機(jī)制一進(jìn)程與線程進(jìn)程程序的一次執(zhí)行,它占有一片獨(dú)有的內(nèi)存空間。事件響應(yīng)模塊負(fù)責(zé)事件的管理。當(dāng)事件發(fā)生時(shí)管理模塊會(huì)將回調(diào)函數(shù)及其數(shù)據(jù)添加到回調(diào)列隊(duì)中。但是子線程完全受主線程控制,且不得操作。向另一個(gè)線程發(fā)送消息。 JavaScript線程機(jī)制與事件機(jī)制 一、進(jìn)程與線程 進(jìn)程(process) 程序的一次執(zhí)行,它占有一片獨(dú)有的內(nèi)存空間。 可以通過(guò)windows任務(wù)管理器查...
摘要:當(dāng)主線程開(kāi)始執(zhí)行異步任務(wù),實(shí)際就是執(zhí)行對(duì)應(yīng)的回調(diào)函數(shù)。異步任務(wù)必須指定回調(diào)函數(shù)。所以注意的是,只是將事件插入了任務(wù)隊(duì)列,必須等到當(dāng)前代碼執(zhí)行棧執(zhí)行完,主線程才會(huì)去執(zhí)行它指定的回調(diào)函數(shù)。 最近本人對(duì)于js的運(yùn)行機(jī)制,特別是異步,還有回調(diào)函數(shù)感覺(jué)很亂,于是參考了很多有用的博客(博客原文地址會(huì)在文末給出),整理如下: js單線程 我們都知道,Javascript語(yǔ)言的執(zhí)行環(huán)境是單線程(si...
摘要:引言學(xué)習(xí)的時(shí)候,經(jīng)常聽(tīng)人說(shuō),即是異步的,又是單線程的。所以我們說(shuō)是異步單線程的。參考從瀏覽器多進(jìn)程到單線程,運(yùn)行機(jī)制最全面的一次梳理運(yùn)行機(jī)制詳解再談異步機(jī)制詳解運(yùn)行原理解析并發(fā)模型與事件循環(huán) showImg(https://segmentfault.com/img/bVbo4hv?w=1800&h=1000); 引言 學(xué)習(xí)javascipt的時(shí)候,經(jīng)常聽(tīng)人說(shuō),javascipt即是異步...
閱讀 1583·2021-11-23 10:01
閱讀 2975·2021-11-19 09:40
閱讀 3221·2021-10-18 13:24
閱讀 3477·2019-08-29 14:20
閱讀 2988·2019-08-26 13:39
閱讀 1282·2019-08-26 11:56
閱讀 2672·2019-08-23 18:03
閱讀 381·2019-08-23 15:35