關(guān)于JS
js是一門單線程語言, 單線程的意思是 js執(zhí)行環(huán)境中負(fù)責(zé)執(zhí)行代碼的線程只有一個(gè)
js最早是一門運(yùn)行在瀏覽器端的腳本語言, 目的是為了實(shí)現(xiàn)頁面上的動(dòng)態(tài)交互, 核心就是 DOM 操作, 這就決定了他必須使用單線程模式工作 (多線程的情況下, 我在一個(gè)線程修改dom, 另一個(gè)線程刪除dom就會(huì)出現(xiàn)線程同步問題)
一個(gè)線程一次就只能執(zhí)行一個(gè)問題, 多個(gè)問題需要處理的情況就需要排隊(duì), 安全簡單, 但容易阻塞
js的異步模式:
1.不會(huì)等待這個(gè)任務(wù)的結(jié)束才開始下一個(gè)任務(wù)
2.對于耗時(shí)操作開啟過后就立即往后執(zhí)行下一個(gè)任務(wù)
3.耗時(shí)任務(wù)的后續(xù)邏輯一般通過回調(diào)函數(shù)的方式定義, 耗時(shí)任務(wù)完成過后就會(huì)自動(dòng)執(zhí)行傳入的回調(diào)
console.log('global begin')
setTimeout(function(timer1(){
console.log('timer1 invoke')
},1800)
setTimeout(function timer2(){
console.log('timer2 invoke')
setTimeout(function inner(){
console.log('inner invoke')
},1000)
},1000))
console.log('global end')
setTimeout 是異步調(diào)用, 內(nèi)部的API環(huán)境就是為回調(diào)函數(shù)開啟了一個(gè)倒計(jì)時(shí)器,放到一邊,這里的倒計(jì)時(shí)器是單獨(dú)工作的, 并不會(huì)受js線程影響, 在web中對應(yīng)線程開啟, 計(jì)時(shí)結(jié)束后就將回調(diào)函數(shù)推入事件隊(duì)列, 等待主執(zhí)行椥蟮酰空閑的時(shí)候讀取調(diào)用, ajax, dom操作類似
宏任務(wù)與微任務(wù)
宏任務(wù)和微任務(wù)都是異步任務(wù),都在任務(wù)隊(duì)列中,但是它們在不同的隊(duì)列中
- 重點(diǎn):在準(zhǔn)備取出每個(gè)宏任務(wù)準(zhǔn)備執(zhí)行前要執(zhí)行完所有的微任務(wù)
- 宏任務(wù):script整體代碼, setTimeout, setInterval…
-
微任務(wù):Promise.then, MutationObserver, process.nextTick (node中)