JavaScript 语言的一大特色是单线程。前端
每开一个标签页系统就建立一个独立的进程,一个进程中可能包含如渲染线程、JS 引擎线程、HTTP 请求线程等。
注意:因为浏览器的优化机制某些进程可能会被合并。面试
若是 JavaScript 是多线程的,假定 procces1 和 procces2 同时对同一个 DOM 做出操做,浏览器应该以哪个为准,因此 JavaScript 只能为单线程。浏览器
任务分为同步任务和异步任务,同步任务会进入主线程,异步任务则会进入事件队列 ( Event Queue )。主线程中的任务执行完毕后会从事件队列中取出放入执行栈。bash
任务除了分为同步任务和异步任务,还分为微任务和宏任务。多线程
事件循环的执行顺序为异步
示例:函数
setTimeout(() => {
new Promise((resolve) => {
console.log('1')
resolve()
}).then(() => {
console.log('2')
})
console.log('3')
}, 0)
console.log('4')
new Promise(resolve => {
console.log('5')
resolve();
}).then(() => {
console.log('6')
})
setTimeout(() => {
new Promise((resolve) => {
console.log('7')
resolve();
}).then(() => {
console.log('8')
})
console.log('9')
}, 0)
复制代码
分析:优化
第一轮事件循环:ui
第一轮事件循环结束输出'4'、5'、'6'spa
第二轮事件循环:
第二轮事件循环结束输出'1'、'3'、'2'
第三轮事件循环:
第三轮事件循环结束输出'7'、'9'、'8'
代码执行完毕输出结果为'4'、5'、'6'、'1'、'3'、'2'、'7'、'9'、'8'
参考:前端面试之道