先上代碼:
setTimeout(() => console.log("r u OK?"), 0);
console.log("hahahaha");
你覺得會輸出什么昙沦?
Why
JavaScript是單線程執(zhí)行的娄猫,js引擎只是瀏覽器的一個線程而已。
在瀏覽器中測試一下以下代碼尚氛,是不是永遠(yuǎn)不會alert?
var isEnd = true;
window.setTimeout(function () { //1s后洞渤,改變isEnd的值
isEnd = false;
}, 1000);
while (isEnd);
alert('end');
看下瀏覽器內(nèi)核:
瀏覽器內(nèi)核
js的執(zhí)行順序是遵循一個叫做事件隊列的機制.從圖中我們可以看出,瀏覽器有各種各樣的線程,比如事件觸發(fā)器,網(wǎng)絡(luò)請求,定時器等等.線程的聯(lián)系都是基于事件的.js引擎處理到與其他線程相關(guān)的代碼,就會分發(fā)給其他線程,他們處理完之后,需要js引擎計算時就是在事件隊列里面添加一個任務(wù). 這個過程中,js并不會阻塞代碼等待其他線程執(zhí)行完畢,而且其他線程執(zhí)行完畢后添加事件任務(wù)告訴js引擎執(zhí)行相關(guān)操作.這就是js的異步編程模型.