js 异步和单线程

时间:2023-01-20 17:45:05

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函数无需等待时间,就立即执行