JavaScript 中的内存管理
JavaScript 是一种高级语言,其 GC(垃圾回收)由现代浏览器(JavaScript 引擎)完成。这给 JavaScript 开发者一种印象,他们既不需要了解幕后发生了什么,也不需要改进 JavaScript 应用的内存管理。C 语言等低级语言速度更快、效率更高的原因之一是我们可以手动控制 GC,因此它们在内存管理方面更加优化、高效。
Javascript内存管理主要包括三个部分:
1)当我们为变量赋值时,它会自动分配一块可用的内存来存储该值,并与该变量建立引用关系。
2) 然后在脚本中使用该变量。
3)当变量不再使用(或引用被删除)时,堆中的内存将自动被释放,以防止内存泄漏。
正如上文所述,JavaScript 使用标记-清除算法进行内存管理。基本上,它会标记脚本正在使用的内存引用,并清除剩余的内存引用。
var apple = {
color: 'red',
category: 'fruits'
}
var apple = {
color: 'red',
category: 'fruits'
}
apple = 10
在某些情况下,垃圾回收机制无法释放未使用的内存,从而导致内存泄漏。作为 JavaScript 开发者,我们可以采取一些措施来尝试预防这种情况。最常见的内存泄漏原因有以下三种:
1) 事件监听器:
当 DOM 元素从 DOM 树中分离,且 JavaScript 中不再引用该元素时,事件监听器将被自动移除。然而,像 IE 这样的老版本浏览器无法正确处理这种情况。此外,我们还应该仔细规划事件监听器的使用,因为它们在大多数时间里都不会被使用,除非事件被触发,而且当这些 DOM 元素处于活动状态时,它们会占用内存。
2) 全局变量
Javascript 中始终存在一个全局对象,例如浏览器中的“window”对象和 Node.js 中的“global”对象。我们应该尽量避免使用全局变量,因为当全局执行上下文仍在堆栈中时,它们将始终存在。此全局执行上下文在任何代码执行之前创建,因此这些全局变量将始终附加,不会被垃圾回收。再次强调,规划很重要。尝试在阻塞范围内使用用“let”和“const”(而不是“var”,如果我们用“var”声明,它将成为全局对象的一部分)定义的局部变量,例如在函数中。当函数调用从堆栈中弹出时,函数中的局部变量会自动清除。
3)在后台持续运行的程序
在使用诸如setInterval()之类的函数时也需要小心。当我们在回调函数中使用变量时,该变量将始终被附加,并且不会被清除。
结论:执行前务必规划,甚至变量赋值的逻辑也应如此。这将有助于提升应用程序的性能,尤其是在规模扩大时。
请关注我,获取更多关于网页设计、编程和自我提升的文章😊