【JS】JS 异步同步 阻塞非阻塞 事件循环 微任务 宏任务
线程
JS的单线程是指一个浏览器进程中只有一个JS的执行线程,同一时刻内只会有一段代码在执行,但是浏览器的渲染进程是多线程的,而异步机制是浏览器的两个或以上常驻线程共同完成的。
同步异步" title="同步异步">同步异步 阻塞非阻塞
事件循环
首先简单了解JS执行顺序
step 1. 读入第一个代码块。
step 2. 语法分析,有错则报语法错误,并跳转到step5。
step 3. 对var变量和function定义做“预编译处理”(预解析)。
step 4. 执行代码段,有错则报错(比如变量未定义)。
step 5. 如果还有下一个代码段,则读入下一个代码段,重复step2。
step 6. 结束。
事件循环
宏任务 微任务
宏任务 macro-task(Task)
一个event loop有一个或者多个task队列。task任务源非常宽泛,比如ajax的onload,click事件,基本上我们经常绑定的各种事件都是task任务源,还有数据库操作(IndexedDB ),需要注意的是setTimeout、setInterval、setImmediate也是task任务源。总结来说task任务源:
- script
- setTimeout
- setInterval
- setImmediate
- I/O
- requestAnimationFrame
- UI rendering
微任务 micro-task(Job)
microtask 队列和task 队列有些相似,都是先进先出的队列,由指定的任务源去提供任务,不同的是一个 event loop里只有一个microtask 队列。另外microtask执行时机和Macrotasks也有所差异
- process.nextTick
- promise
- Object.observe
- MutationObserver
宏任务和微任务的区别
- 宏队列可以有多个,微任务队列只有一个,所以每创建一个新的settimeout都是一个新的宏任务队列,执行完一个宏任务队列后,都会去checkpoint 微任务。
- 一个事件循环后,微任务队列执行完了,再执行宏任务队列
- 一个事件循环中,在执行完一个宏队列之后,就会去check 微任务队列
自我提示
console.log("start")setTimeout(()=>{
console.log(5)
},0)
Promise.resolve().then(()=>{
setTimeout(()=>{
console.log(1)
},0)
console.log(2)
}).then(()=>{
console.log(3)
})
console.log(4)
// process.nextTick(()=>{
// console.log(6)
// })
console.log("end")
以上是 【JS】JS 异步同步 阻塞非阻塞 事件循环 微任务 宏任务 的全部内容, 来源链接: utcz.com/a/98683.html