文章结构

  • 异步
    • JS 是单线程运行的
  • 面试题

异步

1
2
3
4
5
6
console.log(100);
setTimeout(function() {
console.log(200);
}, 1000);
console.log(300);
// 执行结果:100 300 1秒后,200
1
2
3
4
console.log(100);
alert(200); // 1秒钟之后点击确认
console.log(300);
// 执行结果:100 点击alert弹框确认按钮后,200

第一个例子的表现就叫做异步异步不会阻塞后面程序的运行。第二个例子的表现就叫做同步

JS 是单线程运行的

JS 需要异步的根本原因是JS 是单线程运行的,即在同一时间只能做一件事,不能“一心二用”。例如,一个 Ajax 请求由于网络比较慢,请求需要 5 秒钟。如果是同步,这 5 秒钟页面就卡死在这里啥也干不了了。异步的话,5 秒等待就等待了,其他事情不耽误做。

1
2
3
4
5
6
7
8
var a = true;
setTimeout(function() {
a = false;
}, 100);
while (a) {
console.log('while执行了');
}
// 执行结果,程序会一直循环下去,因为js是单线程的,进入循环之后出不了了,所以就不会进入定时器了。

promise

promise 的构造函数执行的优先级>then 的优先级>大于定时器的优先级