JavaScript 變量、做用域和內存問題

JavaScript 變量、做用域和內存問題

ECMAScript 變量可能包含兩種不一樣的數據類型的值,基本類型值和引用類型值。基本類型值指的是簡單的數據段,而引用類型值指由多個值構成的對象。javascript

在將一個值賦給變量時,解析器必須肯定這個值是基本類型值仍是引用類型值。html

經常使用的5種基本數據類型:Undefined、Null、Boolean、Number和String。它們都是按值訪問的。前端

1. 定義變量java

好比:算法

var person = new Object();
person.name = "hello";
alert(person.name);

基本類型的值不能添加屬性,儘管這樣作不會致使任何錯誤。好比:瀏覽器

var name = "Nicholas";
name.age = 20;
alert(name.age); //undefined

2. 變量的複製函數

var num1 = 10;var num2 = num1;

看到上面的例子,是把一個變量num1 複製給另外一個變量num2。num2的值只是num1中的10的一個副本,這2個變量能夠參與任何操做而不會相互影響。spa

當變量間複製引用類型的值時,就有不一樣之處。這個副本實際是一個指針,指向存儲在堆中的一個對象。複製結束後兩個變量實際上將引用同一個對象。所以,改變其中一個變量就會影響另外一個變量。以下面的例子:指針

var obj1 = new Object();var obj2 = obj1;
obj1.name = "Nicholas";
alert(obj2.name); //Nicholas

3. 執行環境及做用域code

執行環境(execution context) 是javascript最爲重要的一個概念。執行環境定義了變量或函數有權訪問的其餘數據,決定了它們各自的行爲。每一個執行環境都有一個與之關聯的變量對象(variable object)。

全局執行環境處在最外圍,在Web瀏覽器中咱們認爲是window對象,所以全部全局變量和函數都是做爲window對象的屬性和方法建立的。當某個執行環境中全部代碼執行完畢後,該環境被銷燬,保存在其中的全部變量或函數定義也隨之銷燬。

每一個函數都有本身的執行環境。當執行流進入一個函數時,函數的環境就會被推入到一個環境棧中。而在函數執行後,棧將其環境彈出,把控制權返回給以前的執行環境。

當代碼在一個環境中執行時,會建立變量對象的一個做用域鏈(scope chain)。做用域鏈的用途是保證對執行環境有權訪問的變量和函數的有序訪問。做用域鏈的前端始終是當前執行代碼所在環境的變量對象,若是這個環境是函數,那麼將其活動對象(activation object) 做爲變量對象。這個活動對象便是arguments對象。做用域鏈的下一個變量對象則是下一個包含環境,這樣一直延續到全局執行環境,那麼全局執行環境的變量對象始終是最後一個對象。

複製代碼

var color = "blue";function changeColor() {    var anotherColor = "red";    function swapColors() {         var tempColor = anotherColor;
         anotherColor = color;
         color = tempColor;         //這裏能夠訪問color、anotherColor和tempColor    } 
    //這裏能夠訪問color和anotherColor,但不能訪問tempColor    swapColors();  
}//這裏只能訪問colorchangeColor();

複製代碼

以上涉及到3個執行環境:全局環境、changeColor()和swapColors()局部環境。

全局環境中有一個全局變量color和一個函數changeColor()。changeColor()局部環境中有一個名爲antherColor變量和一個名爲swapColors()函數。可是它們能夠訪問全局環境中的變量color。swapColors()中有一個變量tempColor,該變量只能在這個環境中訪問到。不管全局環境和changeColor()都無權訪問tempColor。在swapColors()內部則能夠訪問其餘兩個環境中的全部變量,由於那兩個環境是它的父執行環境。

4. 內存問題  

javascript具備自動垃圾收集機制。經常使用的垃圾收集方式是標記清除(mark-and-sweep),就是當變量進入環境時,就將這個變量標記爲「進入環境」。而當變量離開環境時,則將其標記爲「離開環境」。垃圾收集器在運行時會找到那些被加上標記的變量並把它們視爲準備刪除的變量。最後,垃圾收集器完成內存清除工做,銷燬那些帶標記的值並回收它們所佔用的內存空間。

另外一種垃圾收集算法是「引用計數」,這種算法思想是跟蹤記錄全部值被引用的次數。javascript引擎目前都再也不使用這種算法。

相關文章
相關標籤/搜索