【JS】JS 异步同步 阻塞非阻塞 事件循环 微任务 宏任务

线程

JS的单线程是指一个浏览器进程中只有一个JS的执行线程,同一时刻内只会有一段代码在执行,但是浏览器的渲染进程是多线程的,而异步机制是浏览器的两个或以上常驻线程共同完成的。

同步异步" title="同步异步">同步异步 阻塞非阻塞

事件循环

首先简单了解JS执行顺序
step 1. 读入第一个代码块。 
step 2. 语法分析,有错则报语法错误,并跳转到step5。  
step 3. 对var变量和function定义做“预编译处理”(预解析)。  
step 4. 执行代码段,有错则报错(比如变量未定义)。  
step 5. 如果还有下一个代码段,则读入下一个代码段,重复step2。  
step 6. 结束。
事件循环
【JS】JS 异步同步 阻塞非阻塞 事件循环  微任务 宏任务

宏任务 微任务

【JS】JS 异步同步 阻塞非阻塞 事件循环  微任务 宏任务

宏任务 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

回到顶部