灰色世界里的红玫瑰 2022-05-04 13:57:20
js异步执行流程
Event Loop
首先js执行由三部分组成,用于执行主线程的栈,叫做execution context stack,用于存放在对象数据的heap,一般使用内存,用于存放异步事件队列的event queue
- 先说一下主线程的栈的执行流程,每个执行函数会形成一个帧,若干个帧组成了调用栈,然后依据先进后出的执行方式,从最后一个帧执行到第一个帧,前面的帧拥有后面帧的上下文,这个就是层级上下文,每个函数执行完毕之后,就弹出这一帧,销毁当前上下文,当所有的帧执行完毕之后,调用栈就被清空了,主线程此时执行完毕,也就是所谓的主线程闲置状态
- 执行过程产的数据存放在heap中,相应的上下文销毁后,内部的数据对象就会被回收
- 同时,在主线程执行过程中会产生一些异步事件,这些事件会被推入一个叫做callback queue的队列中,先进先出,异步事件的执行取决于event loop,event loop会轮询event queue,每当主调用栈处于闲置状态,事件队列中一个事件就会被推入主调用栈,继续执行步骤1、2、3;以此循环实现event loop
- 大概说一下异步事件的来源和类型,
- settimeout和setintel产生的事件回调,由定时器线程来管理定时任务,当一个定时任务被激活,一个事件就会被推入事件队列
- ajax网络请求的事件回调,由专门的网络请求线程管理
- IO操作,包括鼠标点击,键盘输入和手势操作,
- DOM更改,如requestAnimationFrame事件,Image的onload,document的onload
补充一下几乎 所有的异步事件都有专门的线程来管理,event loop只负责将队列中的事件推入调用栈,至于在什么时机推入,都是由专门的线程负责,定时器模块借助CPU时钟来定时推入事件,DOM的更改事件由渲染进程负责
宏任务与微任务
- 微任务的调度会有一个单独的 queueMicroTask,微任务事件队列依赖于宏任务的执行,当主调用栈清空,event loop检查微微任务队列,然后全部执行完毕,才能执行下一个宏任务,在此期间如果产生新的微任务,就会推入一个新的微任务队列,大概可以理解为每个宏任务有一个属于自己的微任务队列,每当本身执行完毕,还要执行 在此期间产生的 附属的微任务队列
- 最常见的微任务之一就是 promise 的then、finally、catch方法,当这些方法需要运行,就会产生一个微任务
- 共 1 页
- 1
WeakSet和Set都是构造函数,可以使用new命令创建相应的数据结构,并且值都是唯一的;
WeakSet 与 Set 的区别:
1、WeakSet 的成员只能是对象,而不能是其他类型的值,而 Set 对象的成员可以是任意类型的值;
2、WeakSet 对象中储存的对象值都是被弱引用的,即垃圾回收机制不考虑 WeakSet 对该对象的应用,如果没有其他的变量或属性引用这个对象值,则这个对象将会被垃圾回收掉(不考虑该对象还存在于 WeakSet 中),所以,WeakSet 对象里有多少个成员元素,取决于垃圾回收机制有没有运行,运行前后成员个数可能不一致,遍历结束之后,有的成员可能取不到了(被垃圾回收了);
3、由于以上第二点的原因,es6规定WeakSet不能够被遍历,无法使用keys,values等遍历方法,并且不存在size属性。
Map和WeakMap都是构造函数,用域生成键值对的集合;
Map和WeakMap的区别:
1、WeakMap只接受对象作为键名,不接受其他类型的值作为键名,而Map可以接受任何类型的值作为键名;
2、WeakMap的键名所引用的对象都是弱引用,所以这个对象的其他引用都被清除,垃圾回收机制就会释放这个对象所占用的内存;
3、由于第二点的原因,WeakMap不存在遍历操作,没有size的属性,因为WeakMap的键名是不可预测的,可能在不知道的时间,作为键名的对象就被垃圾回收机制清除;
4、不支持clear方法。
第 4 题:介绍下 Set、Map、WeakSet 和 WeakMap 的区别?