# 同步和異步
同步和異步的概念發(fā)生在兩個(gè)程序的交互上。
當(dāng)程序A向程序B發(fā)出請(qǐng)求后:
* 如果程序A在程序B返回結(jié)果后才執(zhí)行下一條語句,那么這種方式是同步。
* 如果程序A不等待程序B返回而直接執(zhí)行下一條語句,那么這種方式是異步。
異步并不是不處理程序B的返回結(jié)果,而是選擇預(yù)先部署一個(gè)函數(shù),等到程序B返回后且程序A空閑時(shí)觸發(fā)該函數(shù)。
在瀏覽器中使用異步的例子:
~~~
setTimeout(function () {
console.log('async');
}, 100);
console.log('sth...');
~~~

這種由異步觸發(fā)的函數(shù)被稱為異步回調(diào)函數(shù),簡稱異步回調(diào)。
另一個(gè)常用的異步操作就是ajax,具體此處不再詳述。
# 任務(wù)隊(duì)列
JS是如何實(shí)現(xiàn)異步的?
JS內(nèi)部有一個(gè)順序容器,每當(dāng)有一個(gè)異步回調(diào)可以被觸發(fā),將加入到容器里的尾部。當(dāng)JS執(zhí)行完所有代碼,就會(huì)從那個(gè)容器的頭部取出一個(gè)函數(shù)來執(zhí)行。因?yàn)檫@種特性,我們把該容器稱為任務(wù)隊(duì)列。
用代碼模擬任務(wù)隊(duì)列:
~~~
var main = function (code) {
var task = [];//每當(dāng)有一個(gè)可觸發(fā)的異步回調(diào)就task.push(p);
eval(code);
while (true) {
if (task.length !== 0) {
var p = task.shift();
p();
}
};
}
main(all.js)
~~~
