1.js為單線程
假設js有兩個線程,一個在某個dom添加內(nèi)容揽惹,另一個在這個dom刪除內(nèi)容被饿,瀏覽器應該以哪個線程為準?
這就意味著搪搏,單線程為js核心標準狭握,將一直沿用下去。
web worker : 號稱讓js成為一門多線程語言
所有新線程受主線程的控制疯溺,不能獨立執(zhí)行论颅。實際上屬于主線程的子線程。
子線程沒有執(zhí)行I/O操作的權限喝检,只能為主線程分擔計算等任務嗅辣,嚴格說,這些線程沒有完整功能挠说,并非改變了js的單線程本質(zhì)澡谭。
2.事件循環(huán)
一直在查找新的事件執(zhí)行,一次執(zhí)行的循環(huán)成為tick损俭,循環(huán)里執(zhí)行的代碼稱為task
任務分同步和異步
js執(zhí)行時將不同變量存在內(nèi)存的不同位置:堆(heap)和棧(stack)中區(qū)分蛙奖。
堆中一般存變量,stack一般存函數(shù)和方法杆兵。
stack叫做執(zhí)行棧雁仲,方法會依次在這里執(zhí)行。
執(zhí)行棧事件先進先出琐脏,任務隊列先進先出攒砖。
web apis代表異步事件,callback queue事件隊列
執(zhí)行棧執(zhí)行主線程任務日裙,當有<font color=#ff0000>操作dom吹艇,ajax交互,定時器</font> 等異步操作時候昂拂,任務會移入到callback queue任務隊列
當主線程執(zhí)行完畢后受神,讀取callbakc quene隊列中的函數(shù),進入主線程執(zhí)行格侯。
不斷重復鼻听,就是常說的<font color=#ff0000>事件循環(huán)(eventloop)</font>
3.macro task和 micro task
不同的異步任務會分為兩類:微任務(micro)和宏任務(macro)
在一個事件循環(huán)中财著,異步事件返回結(jié)果后被放到對應的宏任務隊列或者微任務隊列中去。
<font color=#ff0000>宏任務->這個宏任務中的微任務->下一個宏任務->下一個宏任務添加的微任務</font>
當執(zhí)行棧為空時撑碴,主線程會首先查看微任務中的事件撑教,如果微任務不是空執(zhí)行微任務。如果沒有任務灰羽,在宏任務中取出最前面的一個事件驮履,把對應的回調(diào)加入當前執(zhí)行棧......... 如此反復鱼辙,進入循環(huán)
macro-task(宏任務)
整體代碼
settimeout
setinterval
setlmmediate
主代碼塊 > setImmediate > MessageChannel > setTimeout / setInterval
micro-task(微任務)
process.nextTick > Promise > MutationObserver