JavaScript 中的内存管理

front end technologyjavascriptobject oriented programming

使用某些编程语言编写优秀且有效的程序时,内存管理是一项必不可少的任务。本文将帮助您了解 JavaScript 中内存管理的不同概念。在 C 和 C++ 等低级语言中,程序员应该以某种手动方式关注内存的使用情况。另一方面,当在环境中创建对象时,Javascript 会自动分配内存,并且当对象被销毁时,它也会清理内存。 JavaScript 可以自行管理所有这些,但这并不意味着开发人员不需要担心 JavaScript 中的内存管理。

任何编程语言中的内存管理都涉及三个重要阶段,称为内存生命周期 -

  • 分配程序所需的内存。

  • 利用分配的内存单元。

  • 完成后,清除内存块。

在 JavaScript 中分配内存的不同策略

通过值初始化分配

在 JavaScript 中,我们不需要关心为简单变量分配内存。我们可以直接为一些变量赋值,它会自行分配必要的内存。

语法

var variable1 = <value>
var variable2 = <value>

示例

有关按值进行简单分配,请参阅以下示例。

源代码

<head> <title>HTML Console</title> </head> <body> <h3> Output Console </h3> <p> Output: </p> <div id="output"> </div> <div id="opError" style="color : #ff0000"> </div> <script> var content = '' var error = '' var opDiv = document.querySelector('#output') var opErrDiv = document.querySelector('#opError') // actual javascript code try { var number = 52; var st = 'my_string'; var student = { name: 'Smith', roll: 5, age: 23, }; var arr = [15, null, 'another_string']; content += "Allocated memory for number: " + JSON.stringify(number) + '<br>' content += "Allocated memory for string: " + JSON.stringify(st) + '<br>' content += "Allocated memory for student: " + JSON.stringify(student) + '<br>' content += "Allocated memory for array: " + JSON.stringify(arr) + '<br>' } catch (err) { error += err } finally { // display on output console opDiv.innerHTML = content opErrDiv.innerHTML = error } </script> </body> </html>

从上面的例子可以看出,数字和字符串是单值,分配也很简单。但对于对象和数组,JavaScript也可以轻松地根据它们的值分配内存。

通过函数调用分配

和变量值赋值一样,我们也可以通过调用一些函数来创建一些内存块。例如,当一个函数返回一个单独的对象时,它会自动为系统分配一个新的内存块。

语法

Memory_reference = <function call which returns any value>

示例

以下示例使用了一个在HTML文档上运行的函数。因此该程序将在浏览器或HTML编辑器上运行。

源代码

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> </head> <body> <script> var e = document.createElement('div'); e.innerHTML = "<h1> Header from JavaScript </h1>" document.body.appendChild(e); </script> </body> </html>

在此示例中,JavaScript 代码位于 HTML 中的 <script> 标记内。请注意,在这种情况下,最初,文档在 <body> 内没有任何 <div> 块。JavaScript 通过调用 createElement() 创建一个新组件,然后创建一个新的 div 块。此块分配内存,但仅在调用函数时才分配。之后,将新组件添加为 body 标记的子项,以便在 HTML 文档中使用它。

在 JavaScript 中使用先前分配的内存

使用先前分配的内存只是从先前分配的一些变量中读取或写入值。我们可以用其他值更新其现有值。请参阅以下示例以更好地理解−

示例

最初为变量分配内存,然后从中读取值。写入新值并再次从中读取。

源代码

<!DOCTYPE html> <html> <head> <title>HTML Console</title> </head> <body> <h3> Output Console </h3> <p> Output: </p> <div id="output"> </div> <div id="opError" style="color : #ff0000"> </div> <script> var content = '' var error = '' opDiv = document.querySelector('#output') var opErrDiv = document.querySelector('#opError') // actual javascript code try { var a = 52; // allocate memory content += "Reading value of variable a: " + JSON.stringify(a) + '<br>' a = 100 content += "Reading value of variable a: " + JSON.stringify(a) + '<br>' } catch (err) { error += err } finally { // display on output console opDiv.innerHTML = content opErrDiv.innerHTML = error } </script> </body> </html>

在 JavaScript 中释放内存块

当我们的目的达到后,我们可以移除已分配的内存块。在某些低级语言中,这是必要的步骤,否则,随着时间的推移,它可能会占用内存空间,整个系统可能会崩溃。JavaScript 还原生支持垃圾收集器,它可以清理不必要的内存块并清除内存。但有时编译器无法理解某个块是否会在以后的情况下使用。在这种情况下,垃圾收集器不会清理该内存。要手动移除已分配的位置,我们可以在变量名前使用"delete"关键字。

语法

delete <variable_name>

必须事先分配变量,否则,在尝试删除该变量时会引发错误。让我们看一个例子来清楚地理解这个概念。

示例

源代码

<!DOCTYPE html> <html> <head> <title>HTML Console</title> </head> <body> <h3> Output Console </h3> <p> Output: </p> <div id="output"> </div> <div id="opError" style="color : #ff0000"> </div> <script> var content = '' var error = '' var opDiv = document.querySelector('#output') var opErrDiv = document.querySelector('#opError') // actual javascript code try { a = "a simple variable"; // allocate memory content += "Reading value of variable a: " + JSON.stringify(a) + '<br>' delete a content += "Reading value of variable a: " + JSON.stringify(a) + '<br>' } catch (err) { error += err } finally { // display on output console opDiv.innerHTML = content opErrDiv.innerHTML = error } </script> </body> </html>

注意− 'delete' 关键字仅在直接分配变量时才有效(不使用 var 或 let 关键字)。

结论

使用任何编程语言时,程序员都应该深入了解整体概念。内存管理是令人担忧的问题之一,开发人员应该妥善管理内存,否则它将占用不必要的内存块并在环境中造成重大问题。JavaScript 提供了一个额外的垃圾收集器工具,可以自动清理未使用的内存块。但是,我们也可以在变量名前使用 'delete' 关键字来释放内存(假设:变量是在不使用 let 或 var 关键字的情况下分配的。)


相关文章