1. 程式人生 > >史上最全的變量、作用域和內存問題

史上最全的變量、作用域和內存問題

分配 data () pen ole 創建 最全 操作符 釋放內存

(一)JavaScript變量能夠用來保存兩種類型的值:基本類型值和引用類型值。基本類型的值源自下面5種基本數據類型:Undefined、Null、Boolean、Number和 String。基本類型值和引用類型值具有下面特點:

1.基本類型值在內存中占領固定大小的空間,因此被保存在棧內存中;

2.從一個變量向還有一個變量復制基本類型的值。會創建這個值的一個副本。

3.引用類型的值是對象,保存在堆內存中;    

4.包括引用類型值的變量實際上包括的並非對象本身。而是一個指向該對象的指針;

5.從一個變量向還有一個變量復制引用類型的值,復制的事實上是指針,因此兩個變量終於都指向同一個對象;

5.確定一個值是哪種基本類型能夠使用typeof操作符。而確定一個值是哪種引用類型能夠使用instanceof操作符。

(二)全部變量(包括基本類型和引用類型)都存在於一個運行環境(也稱為作用域)其中,這個運行環境決定了變量的生命周期。以及哪一部分代碼能夠訪問其中的變量。下面是關於運行環境的幾點總結:

1.運行環境有全局運行環境(也稱為全局環境)和函數運行環境之分;

2.每次進入一個新運行環境,都會創建一個用於搜索變量和函數的作用域鏈。

3.函數的局部環境不僅有權訪問函數作用域中的變量,並且有權訪問其包括(父)環境,乃至全局環境;

4.全局環境僅僅能訪問在全局環境中定義的變量和函數。而不能直接訪問局部環境中的不論什麽數據;變量的運行環境有助於確定應該何時釋放內存。

(三)JavaScript是一門具有自己主動垃圾收集機制的編程語言,開發者不必關心內存分配和回收問題。

能夠對JavaScript的垃圾收集例程作例如以下總結。

1.離開作用域的值將被自己主動標記為能夠回收,因此將在垃圾收集期間被刪除。

2.“標記清除”是眼下主流的垃圾收集算法。這樣的算法的思想是給當前不使用的值加上標記,然後再回收其內存。 3.還有一種垃圾收集算法是“引用計數”,這樣的算法的思想是跟蹤記錄全部值被引用的次數。JavaScript引擎眼下都不再使用這樣的算法; 4.但在IE中訪問非原生JavaScript對象(如DOM元素)時,這樣的算法仍然可能會導致問題。當代碼中存在循環引用現象時,“引用計數”算法就會導致問題。

6.為了確保有效地回收內存,應該及時解除不再使用的全局對象、全局對象屬性以及循環引用變量的引用。

本文由web前端精髓為您提供

史上最全的變量、作用域和內存問題