1.1.关于异步
//demo
console.log(100);
setTimeout(function(){
console.log(200);
},1000);
console.log(300);
100300undefined200
从上面的例子看到,它的流程并不是:
先打印100,过1s后打印200,然后打印300;
而是:
先打印100,然后打印300,接着1s后打印200;
1.2.对比同步
//demo
console.log(100);
alert(200); // 需要你点击确认
console.log(300);
这个例子我们可以看到:先打印100,然后需要你点击确认后再弹出200,最后打印300;
1.3.何时需要异步
- 有可能发生等待的情况
- 等待过程不能向alert一样阻塞程序运行
-
因此,等待的情况需要异步
1.4.前端使用异步的场景
- 定时任务:setTimeout setInverval
- 网络请求:ajax请求、动态<img>加载
- 事件绑定
2.单线程
//demo
console.log(100);
setTimeout(function(){
console.log(200);
});
console.log(300);
当定时时间为0时,也是100 300 200;
执行过程如下:
- 执行第一行,打印100
- 执行setTimeout后,传入set Timeout的函数会被暂存起来,不会立即执行(单线程的特点,不能同时干两件事)
- 执行最后一行,打印300
- 所有程序执行完成,处于空闲状态时,会立马看到有没有暂存起来要执行的
- 发现暂存起来的setTimeout函数无需等待时间,就立即执行