【JS】何为事件循环(eventLoop)?它有什么用?事件循环与任务队列详析

JS为什么是单线程语言?

众所周知,JS语言运行在浏览器当中,页面里面有可视的Dom,如果是多线程的话,这个线程正在删除DOM节点,另一个线程正在编辑Dom节点,导致浏览器不知道该听谁的,为了避免复杂性和冲突,JS语言从诞生时就是一个单线程语言,即同一时间只能去做一件事。

实际上,利用多核CPU的计算能力,HTML5提出Web Wroker标准,允许javaScript脚本创建多个线程,主线程用来执行同步任务,其他线程用来执行异步任务。

作为单线程语言,JS如何实现异步任务?

异步任务是指在条件触发时立即执行的任务,是不按照代码顺序执行的任务,浏览器也不确定何时能够完成它,可能是0.1s,也可能需要10多秒,为了用户更好的体验,不让异步任务阻塞主线程,JS提出了任务队列和事件循环机制来解决这个问题。

一般而言,异步任务有以下三种类型:
1、普通dom事件,如click、resize等
2、资源加载,如load、arror、网络请求等
3、定时器,包括setInterval、setTimeout等

任务队列:JS把代码分为同步任务和异步任务,同步任务进入主线程从上往下依次执行,异步任务进入一个任务队列当中,当主线程执行完同步任务后,主线程才会去执行任务队列里面的异步任务。

事件循环:JS主线程在执行完同步任务后,主线程不断地从任务队列中获取、执行任务的循环过程就叫做事件循环。

事件循环的出现使得JS这个单线程语言不会出现阻塞情况,提高了用户使用体验。

任务队列分为几类?

只有异步任务才会进入任务队列,异步任务又分为宏任务和微任务,主线程会优先选择微任务执行。

常见的异步任务:

宏任务:定时器、

微任务:promise.then的回调函数、process.nextTick(node.js环境)

猜你喜欢

转载自blog.csdn.net/Andye11/article/details/129098268