JS是單線程的
同步:指的是等待一件事情完成之后才會去執(zhí)行下一件事,JS中大部分都是同步編程。循環(huán)就是同步的,所以在編碼過程中盡量減少循環(huán)的使用
異步:規(guī)劃一件事情,但不是立即去執(zhí)行档礁,需要等待一定的事件,此時異步編程不會等待他執(zhí)行吝沫,而是先去執(zhí)行下面的操作呻澜,當(dāng)下面的事情處理完再回過來執(zhí)行這個事件
JS中異步編程只有四種情況:
1、定時器
2惨险、事件綁定
3羹幸、ajax讀取數(shù)據(jù)的時候設(shè)置為異步
4、回調(diào)函數(shù)也是異步編程的
var n = 0;
window.setTimeout(function () {
n ++;
console.log(n);
}, 0);
console.log(n);
先輸出0辫愉,再輸出1
因為瀏覽器對與定時器的等待時間都有一個最小值栅受,若小于這個最小值,就會按照最小值時間等待
// 0 0 5 7 任務(wù)隊列中誰先到時間就先執(zhí)行誰
var n = 0;
window.setTimeout(function () {
n += 2;
console.log(n);
}, 100);
window.setTimeout(function () {
n += 5;
console.log(n);
}, 50);
console.log(n);
for (var i = 0; i < 10000000; i++) {}
console.log(n);
因為綁定事件是異步編程的恭朗,先綁定完點(diǎn)擊的時候再觸發(fā)屏镊, 解決方法就是閉包
// 選項卡綁定
for (var i = 0; i < oList.length; i++) {
oList[i].onclick = function () {
tabChange(i);
}
}