什么是JavaScript垃圾回收?一个web程序员需要了解JavaScript垃圾回收的重要性,以便编写更好的代码。
什么是JavaScript垃圾回收?一个web程序员需要了解JavaScript垃圾回收的重要性,以便编写更好的代码。
delete
运算符。在JavaScript中,delete
运算符从一个对象中删除属性,与C / C ++中的delete
完全不同。delete
;例如,在第一个例子中,你应该先通过 window.removeEventListener()
移除事件监听器,然后使用 foo = null
覆盖变量,而不是使用 delete foo
。在 IE 中,如果 foo
是全局的,delete window.foo
(但不是 delete foo
)也可以起作用,但即使如此,在 FF 或 Opera 中仍然行不通。 - Christophdelete
是一个一元运算符(表达式),而不是语句(例如:delete 0,delete 0,delete 3
)。当作为表达式语句时,它看起来像语句。 - user5066707当涉及DOM对象时,请注意循环引用:
请记住,只有当没有对对象的活动引用时,才可以回收内存。这是闭包和事件处理程序的常见陷阱,因为某些JS引擎不会检查内部函数实际上引用了哪些变量,并且仅保留封闭函数的所有局部变量。
以下是一个简单的示例:
function init() {
var bigString = new Array(1000).join('xxx');
var foo = document.getElementById('foo');
foo.onclick = function() {
// this might create a closure over `bigString`,
// even if `bigString` isn't referenced anywhere!
};
}
从博客中摘取的好引言
DOM组件和JScript组件都会被"垃圾回收",这意味着如果你在任一组件中创建一个对象,然后失去了该对象的跟踪,它最终将被清理掉。
例如:
function makeABigObject() {
var bigArray = new Array(20000);
}
当您调用该函数时,JScript组件会创建一个对象(名为bigArray),该对象在函数内部可访问。但是,一旦函数返回,您就“失去了”bigArray,因为没有办法再引用它。好吧,JScript组件意识到您已经失去了它,因此bigArray被清理 - 它的内存被回收。DOM组件也是同样的原理。如果您说document.createElement('div')
或类似的内容,则DOM组件会为您创建一个对象。一旦您以某种方式失去了该对象的跟踪,DOM组件将清理相关内容。垃圾回收(GC)是一种自动内存管理的形式,通过移除不再需要的对象来实现。
任何处理内存的过程都遵循以下步骤:
1 - 分配所需的内存空间
2 - 进行一些处理
3 - 释放该内存空间
有两种主要算法用于检测哪些对象不再需要。
引用计数垃圾回收:该算法将“一个对象不再需要”定义为“没有其他对象引用它”,如果没有引用指向它,则将删除该对象。
标记-清除算法:将每个对象连接到根源。任何未连接到根源或其他对象的对象都将被删除。
目前大多数现代浏览器使用第二种算法。
所有JavaScript引擎都有自己的垃圾收集器,并且它们可能不同。大多数情况下,您无需处理它们,因为它们只会执行它们应该执行的操作。
编写更好的代码主要取决于您对编程原则、语言和特定实现的了解程度。
引用类型并不直接将对象存储到分配给它的变量中,因此下面示例中的对象变量实际上并不包含对象实例。相反,它保存一个指向内存中对象存在位置的指针(或引用)。
var object = new Object();
如果你将一个引用类型的变量赋值给另一个变量,每个变量都会得到指针的副本,并且两个变量仍然引用内存中的同一个对象。
var object1 = new Object();
var object2 = object1;
JavaScript是一种垃圾回收语言,因此使用引用类型时不需要担心内存分配。然而,最好是取消引用不再需要的对象,以便垃圾回收器可以释放那部分内存。这样做的最佳方式是将对象变量设置为null。
var object1 = new Object();
// do something
object1 = null; // dereference
取消引用对象在使用数百万个对象的非常大型应用程序中尤为重要。
出自《面向对象的JavaScript原理》- NICHOLAS C. ZAKAS
let a = new Array(200).fill(true);
构建 finaliaser
const cleanup = new FinalizationRegistry(key => {
// your code here
});
cleanup.register(a, 'wewew');
对象'a'现在不可达,垃圾回收后将发生终结器回调