JS的单线程的概念
- JS是单线程的编程语言,也就是说同一时间只能做一件事,这样能提高效率;
- 任务队列:同步任务(console.log())、异步任务(setTimeout())挂起,优先处理同步任务,再去响应异步任务;
案例
例1:
console.log(1);
setTimeout(function(){
console.log(2);
},0);//挂起
console.log(3);
运行结果:132
原因:在所有同步任务执行完之前,任何的异步任务是不会执行的
例2:
console.log('A');
setTimeout(function () {
console.log('B');
}, 0);
while (1) {
}
运行结果:A
原因:由于同步任务while循环没有执行完成,导致一直无法处理异步任务setTimeout();
例3:
for (var i = 0; i < 4; i++) {
setTimeout(function () {
console.log(i);
}, 1000);
}
运行结果:4444
原因:由于for循环是一个同步任务,而setTimeout()是异步方法,所以for循环结束后才会执行异步任务setTimeout(),当for循环结束后是i的值为4,所以这个时候执行的异步任务中的i为4;
异步队列执行的时间,事件循环
1. 什么是任务队列(消息队列)
任务队列中分为两种任务: 同步任务和异步任务;
同步任务: 指在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;
异步任务: 指不进入主线程、而进入"任务队列"(task queue)的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。
2. 什么是Event Loop
概念: 主线程从"任务队列"中读取事件,这个过程是循环不断的,所以整个的这种运行机制又称为Event Loop(事件循环)。只要主线程空了,就会去读取"任务队列",这就是JavaScript的运行机制。
哪些语句会放入异步任务队列及放入时机
setTimeout和setInterval
DOM事件
ES6中的Promise
总结:
理解JS的单线程的概念
理解任务队列
理解Event Loop
理解哪些语句会放入异步任务队列
理解语句放入异步任务队列的时机
80% 应聘者都不及格的 JS 面试题【参考链接】https://juejin.im/post/58cf180b0ce4630057d6727c
深入浅出Javascript事件循环机制(上)【参考链接】https://zhuanlan.zhihu.com/p/26229293
彻底弄懂 JavaScript 执行机制【参考链接】https://www.jb51.net/article/149358.htm