# 同步和异步
同步和异步的概念发生在两个程序的交互上。
当程序A向程序B发出请求后:
* 如果程序A在程序B返回结果后才执行下一条语句,那么这种方式是同步。
* 如果程序A不等待程序B返回而直接执行下一条语句,那么这种方式是异步。
异步并不是不处理程序B的返回结果,而是选择预先部署一个函数,等到程序B返回后且程序A空闲时触发该函数。
在浏览器中使用异步的例子:
~~~
setTimeout(function () {
console.log('async');
}, 100);
console.log('sth...');
~~~
![](https://box.kancloud.cn/05bd2e4e33d224a42f2434385713a555_148x46.jpg)
这种由异步触发的函数被称为异步回调函数,简称异步回调。
另一个常用的异步操作就是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)
~~~