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

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