- A+
JS事件循环机制总结
JS事件循环设计的原因
(1)JS的特点:JavaScript语言最大的一个特点就是单线程,也就是说,同一时间只能做一件事情,(非阻塞),执行代码的时候只有一个主线程来处理所有任务;
(2)单线程原因:JavaScript的单线程与它的用途有关,JavaScript作为浏览器脚本语言,JavaScript主要用途是与用户交互,以及DOM操作(JavaScript对DOM节点的操作包括访问,创建,添加,删除,替换,插入,复制,移动等),这就决定了JavaScript只能是单线程(如果是多线程的话,那么可能出现在同一时间对一个DOM中的节点进行不同的操作的话,就会出现问题,问题就会变得很复杂)—HTML5允许JavaScript脚本创建多个线程,但是子线程完全受主线程的控制;
(3)宿主环境:虽然JS是单线程的,但是JS的宿主环境是多线程的(浏览器下的js引擎为事件循环机制JS提供了表达程序逻辑的语法和实现基本功能的API,浏览器是JS得到真实运行环境,又称JS的宿主环境,JS宿主环境中的一个功能模块:JS执行引擎,可以解析并执行JS),;
(4)浏览器线程:浏览器中含有的线程:
(5)进程和线程的概念:
进程:当一个应用程序运行时,需要使用内存和CPU资源,这些资源需要向操作系统申请。操作系统以进程的方式来分配这些资源,一个进程就代表着一块独立于其他进程的内存空间。一个应用程序要运行,必须至少有一个进程启动。进程的最大特点是独立,一个进程不能随意的访问其他进程的资源。这就保证了多个程序在操作系统上运行互不干扰,
线程:可能要同时执行多个任务,每个任务需要在一个线程上运行,线程与线程之间相对独立,但可以共享应用程序的进程数据
JS事件循环中术语概念
(1)普通的栈对立:当JavaScript代码执行的时候会将不同的变量存于内存中的不同位置:
堆:堆里面存放着一些对象;
栈:栈里面存放一些基础变量以及对象指针;
(2)执行栈:当我们在js中调用一个方法的时候,js会生成一个与这个方法对应的执行环境(context),又叫执行上下文,这个执行环境中,存有这个方法的私有作用域,上层作用域的指向,方法的参数,以及这个作用域的this对象。又因为js是单线程的,同一个时间只能执行一个方法,所以所有的方法被安排在一个单独的地方,等待被调用;
(3)任务队列:事件队列在不同的宿主环境中有所差异,大部分宿主环境会将事件队列进行细分。在浏览器中,事件队列分为两种:宏任务(队列)macroTask:计时器结束的回调、事件回调、http回调等等绝大部分异步函数进入宏队列 ;微任务(队列)microTask:Promise的回调, MutationObserver(用于监听某个DOM对象的变化)当执行栈清空时,JS引擎首先会将微任务中的所有任务依次执行结束,如果没有微任务,则执行宏任务;
(4)宏任务和微任务:
JS事件循环的实现细节
(1)事件循环: