事件循环机制(event loop)
JS是单线程的,它的运行是基于事件循环机制(event loop),简单说,就是同步的代码会在调用栈里按顺序执行,异步的代码会被放入任务队列中,当调用栈中的代码执行完毕后,任务队列中的代码才会按照顺序依次进入到栈中执行。
任务队列又分为宏任务队列与微任务队列,微任务先执行,宏任务后执行。
宏任务:
- setInterval()
- setTimeout()
- ajax请求
- 事件绑定
微任务:
- Promise的then,catch里的代码
queueMicrotask( )原生方法
nextTick( ),它最先执行,很早之前它属于tick队列,在微任务之前执行
console.log('1');
let promise = new Promise((resolve,reject)=>{
console.log('2');
resolve('www')
})
promise.then(r=>console.log('3'))
console.log('4');
setTimeout(()=>{
console.log('5');
},1000)
queueMicrotask(()=>{
console.log('6');
})
console.log('7');
//1,2,4,7,3,6,5
拓展:
进程与线程
进程是系统进行资源分配和调度的基本单位,一般程序开始运行进程就开始,关闭就结束。
线程是是操作系统能够进行运算调度的最小单位,一个进程中可以存在多个线程,每条线程执行不同的任务。
进程就相当于一个工厂,线程就相当于工人,一个工厂可以有多个工人。
js是单线程,因为操作dom的时候,线程多了会导致页面混乱,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器就无法判断用哪个线程,会导致页面出问题。