1.3. JS執(zhí)行機(jī)制
以下代碼執(zhí)行的結(jié)果是什么?
console.log(1);
setTimeout(function () {
console.log(3);
}, 1000);
console.log(2);
以下代碼執(zhí)行的結(jié)果是什么匆帚?
console.log(1);
setTimeout(function () {
console.log(3);
}, 0);
console.log(2);
1.3.1 JS 是單線程
單線程就意味著,所有任務(wù)需要排隊(duì)旁钧,前一個(gè)任務(wù)結(jié)束吸重,才會(huì)執(zhí)行后一個(gè)任務(wù)。如果前一個(gè)任務(wù)耗時(shí)很長(zhǎng)歪今,后一個(gè)任務(wù)就不得不一直等著嚎幸。
這樣所導(dǎo)致的問(wèn)題是: 如果 JS 執(zhí)行的時(shí)間過(guò)長(zhǎng),這樣就會(huì)造成頁(yè)面的渲染不連貫寄猩,導(dǎo)致頁(yè)面渲染加載阻塞的感覺(jué)嫉晶。
1.3.2 同步任務(wù)和異步任務(wù)
? 單線程導(dǎo)致的問(wèn)題就是后面的任務(wù)等待前面任務(wù)完成,如果前面任務(wù)很耗時(shí)(比如讀取網(wǎng)絡(luò)數(shù)據(jù)),后面任務(wù)不得不一直等待L娣稀箍铭!
? 為了解決這個(gè)問(wèn)題,利用多核 CPU 的計(jì)算能力椎镣,HTML5 提出 Web Worker 標(biāo)準(zhǔn)诈火,允許 JavaScript 腳本創(chuàng)建多個(gè)線程,但是子線程完全受主線程控制状答。于是冷守,JS 中出現(xiàn)了同步任務(wù)和異步任務(wù)。
同步
? 前一個(gè)任務(wù)結(jié)束后再執(zhí)行后一個(gè)任務(wù)惊科,程序的執(zhí)行順序與任務(wù)的排列順序是一致的拍摇、同步的。比如做飯的同步做法:我們要燒水煮飯馆截,等水開(kāi)了(10分鐘之后)充活,再去切菜,炒菜孙咪。
異步
? 你在做一件事情時(shí)堪唐,因?yàn)檫@件事情會(huì)花費(fèi)很長(zhǎng)時(shí)間,在做這件事的同時(shí)翎蹈,你還可以去處理其他事情淮菠。比如做飯的異步做法,我們?cè)跓耐瑫r(shí)荤堪,利用這10分鐘合陵,去切菜,炒菜澄阳。
JS中所有任務(wù)可以分成兩種拥知,一種是同步任務(wù)(synchronous),另一種是異步任務(wù)(asynchronous)碎赢。 同步任務(wù)指的是: 在主線程上排隊(duì)執(zhí)行的任務(wù)低剔,只有前一個(gè)任務(wù)執(zhí)行完畢,才能執(zhí)行后一個(gè)任務(wù)肮塞; 異步任務(wù)指的是: 不進(jìn)入主線程襟齿、而進(jìn)入”任務(wù)隊(duì)列”的任務(wù),當(dāng)主線程中的任務(wù)運(yùn)行完了枕赵,才會(huì)從”任務(wù)隊(duì)列”取出異步任務(wù)放入主線程執(zhí)行猜欺。
1.3.3 JS執(zhí)行機(jī)制(事件循環(huán))
1.3.4 代碼思考題
console.log(1);
document.onclick = function() {
console.log('click');
}
setTimeout(function() {
console.log(3)
}, 3000)
console.log(2);