专业企业建站系统,企业网站建设方案流程,做一个营销型网站多少钱,广告设计专业哪个大学最好详细#xff1a;https://github.com/febobo/web-interview 5.事件循环
js是一种单线程语言#xff0c;同一时间内只能做一件事情#xff0c;为了避免单线程阻塞的方法就是事件循环。
在javascript当中#xff0c;所有的任务都可以分为#xff1a; 同步任务#xff1a;按… 详细https://github.com/febobo/web-interview 5.事件循环
js是一种单线程语言同一时间内只能做一件事情为了避免单线程阻塞的方法就是事件循环。
在javascript当中所有的任务都可以分为 同步任务按顺序执行的任务一个任务的执行必须等待前一个任务的完成。同步任务一般会直接进入主线程执行。 异步任务不按顺序执行的任务可以在后台执行不会阻塞代码的执行。比如ajax网络请求setTimeoutsetinterval定时函数等Promiseasync/await等。 同步任务进入主线程即主执行栈异步任务进入任务队列主线程内的任务执行完毕为空会去任务队列读取对应的任务推入主线程执行。上述过程的不断重复就事件循环。
①宏任务与微任务
在JavaScirpt当中宏任务macrotask和微任务microtask是异步任务的两种类型它们有不同的执行时机和优先级。
宏任务macrotask 宏任务代表的是一组任务的执行可以看作是每一个独立的、完整的任务。 常见的宏任务包括整体的代码块scirpt)、setTimeout、setInterval、I/O操作、UI渲染等。 当执行栈中的任务执行完毕后js运行时会检查是否有宏任务需要执行然后选择一个宏任务执行执行完后再次清空执行栈。
微任务microtask 相对于更“细粒度”的任务执行时机位于当前任务执行结束后、下一个宏任务开始之前。 常见的微任务包括Promise的处理、MutationObserver变动观察器等。 微任务通常用于处理异步操作的结构其优先级高于宏任务及在当前宏任务执行完毕后会优先执行微任务队列中的任务直到微任务队列为空才会执行下一个宏任务。
在执行顺序上JavaScript 的事件循环(Event Loop)会先执行当前执行栈中的任务然后检查是否有微任务需要执行如果有会依次执行微任务队列中的所有任务直到微任务队列为空最后再执行下一个宏任务。这样的循环过程不断重复直到所有任务执行完毕。 console.log(1)setTimeout((){console.log(2)
}, 0)new Promise((resolve, reject){console.log(new Promise)resolve()
}).then((){console.log(then)
})console.log(3)如果按照上面流程图来分析代码我们会得到下面的执行步骤
1.console.log(1)首先会打印出 1因为这是同步代码会立即执行并输出 1。2.遇到 setTimeout会将回调函数推入宏任务队列等待当前执行栈清空后执行。3.遇到 Promise 对象会立即执行 Promise 的构造函数中的代码输出 new Promise。1紧接着resolve() 会立即执行表示 Promise 状态变为 resolved进入 then 方法的回调链。2由于 Promise 的状态是 resolved所以 then 方法中的回调函数会被放入微任务队列中等待执行。3接着会打印出 3因为这是同步代码会立即执行并输出 3。
4.此时宏任务执行完成开始执行微任务队列执行 then 方法输出 then5. 当一次宏任务执行完再去执行新的宏任务这里就剩一个定时器的宏任务了执行它输出 2结果是1new Promise 3 then 2 详情可见Jake的博客Tasks, microtasks, queues and schedules这篇文章非常经典。