WeakRef(弱参考)
描述
尽可能避免
垃圾收集器 都很复杂。 如果应用程序或库依赖GC清理WeakRef或以及时、可预测的方式调用终结器[cleanup callback],则可能会令人失望:清理可能会比预期晚很多,或者根本不会发生。 可变性的来源包括:
一个对象可能比另一个对象更快地被垃圾收集,即使它们同时变得不可访问,例如,由于世代收集。 垃圾收集工作可以使用增量和并发技术随时间分割。 可以使用各种运行时启发来平衡内存使用和响应。 JavaScript引擎可能会保存对看起来无法访问的内容的引用(例如,在闭包或内联缓存中)。 不同的JavaScript引擎可能会以不同的方式执行这些操作,或者同一个引擎可能会跨版本更改其算法。 复杂的因素可能会导致对象在意想不到的时间内保持活动状态,例如与某些API一起使用。
关于WeakRefs的注释
如果您的代码刚刚创建了 WeakRef(弱参考) 或已从 WeakRef(弱参考) 的 废弃的 方法,则在当前JavaScript结束之前不会回收该目标对象 工作 (包括在脚本作业结束时运行的任何承诺反应作业)。 也就是说,您只能“看到”在事件循环的两次循环之间回收的对象。 这主要是为了避免在代码中显示任何给定JavaScript引擎的垃圾收集器的行为,因为如果是这样的话,人们就会依赖该行为来编写代码,而当垃圾收集器行为发生变化时,该行为就会中断。 (垃圾收集是一个难题;JavaScript引擎实现者正在不断完善和改进其工作方式。) 如果有多个 WeakRef(弱参考) 我们有相同的目标,他们彼此一致。 调用的结果 放弃 其中一个将匹配调用结果 放弃 在另一个(在同一个作业中)上,您不会从其中一个获取目标对象,但 未定义 来自另一个。 如果 WeakRef(弱参考) 也位于 定案注册表 ,的 WeakRef(弱参考) 的目标同时或在调用与注册表关联的任何清理回调之前被清除; 如果您的清理回调调用 放弃 在上 WeakRef(弱参考) 对于对象,它将接收 未定义 . 无法更改的目标 弱点参考 ,它将始终仅为原始目标对象或 未定义 当目标被回收时。 A类 WeakRef(弱参考) 可能永远不会回来 未定义 从 放弃 ,即使没有什么东西可以牢牢地控制目标,因为垃圾收集器可能永远不会决定回收对象。
施工单位
弱参考() -
创建新的 WeakRef(弱参考) 对象。
实例属性
WeakRef.原型.结构 可选 -
创建实例对象的构造函数。 对于 WeakRef(弱参考) 实例,初始值为 WeakRef(弱参考) 构造函数。 注: 该属性在规范中标记为“标准可选”,这意味着一致的实现可能不会暴露 建造师 属性。 这可以防止任意代码获取 WeakRef(弱参考) 构造函数并能够观察垃圾收集。 然而,默认情况下,所有主要引擎都会公开它。 WeakRef.原型[Symbol.toStringTag] -
的初始值 [Symbol.toStringTag] 属性是字符串 “弱参考” 。此属性用于 Object.prototype.toString() .
实例方法
WeakRef.prototype.deref() -
返回 WeakRef(弱参考) 对象的目标对象,或 未定义 如果目标对象已被回收。
示例
使用WeakRef对象
类计数器{ 构造函数(元素){ //记住对DOM元素的弱引用 this.ref=新的WeakRef(元素); this.start(); } 启动(){ if(this.timer){ 回报; } this.count=0; 常数刻度=()=>{ //从弱引用获取元素(如果它仍然存在) const元素=this.ref.deref(); if(元素){ element.textContent=++this.count; }其他{ //元素不再存在 console.log(“元素不见了。”); this.stop(); this.ref=空; } }; tick(); this.timer=setInterval(tick,1000); } 停止(){ if(this.timer){ clearInterval(this.timer); this.timer=0; } } } const counter=新计数器(document.getElementById(“计数器”)); setTimeout(()=>{ document.getElementById(“计数器”).remove(); }, 5000);