JavaScript 記憶體管理


在某些程式語言中,編寫良好有效的程式時,記憶體管理是一項必不可少的任務。本文將幫助您瞭解 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 關鍵字的情況下分配的)。

更新於: 2022-08-22

1K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告