Chapter4 變數、作用域和記憶體問題 l 理解基本類型和引用類型的值 l 理解執行環境 l 理解垃圾收集 4.1基本類型和引用類型的值 l ECMAScript變數包含兩種不同數據類型的值:基本類型值和引用類型值。 l 在將一個值賦給變數時,解析器必須確定這個值是基本類型值還是引用
Chapter4 變數、作用域和記憶體問題
l 理解基本類型和引用類型的值
l 理解執行環境
l 理解垃圾收集
4.1基本類型和引用類型的值
l ECMAScript變數包含兩種不同數據類型的值:基本類型值和引用類型值。
l 在將一個值賦給變數時,解析器必須確定這個值是基本類型值還是引用類型值
l 基本類型值:簡單數據段
Undefiened,Null,Boolean,Number,String(按值訪問)
l 引用類型值:可能由多個值構成的對象
Object(複製時:按引用訪問;增加對象屬性:操作實際對象)
4.1.1動態的屬性
l 對於引用類型的值,可以添加屬性和方法,也可以刪除屬性和方法
l 對於基本類型的值,無法給其添加屬性和方法(雖然不會導致任何錯誤)
4.1.2複製變數值
l 基本類型值:創建新值,複製到為新變數分配的位置上
特點:副本,互不影響
複製前的變數對象
|
|
|
|
Num1 |
5 (Number 類型) |
複製後的變數對象
|
|
Num2 |
5 (Number 類型) |
Num1 |
5 (Number 類型) |
l 引用類型值:創建新值,複製到為新變數分配的位置上
但是創建的新值實際上是一個指針,指向存儲在堆中的一個對象
特點:兩個變數將引用同一個對象,互相影響
複製前的變數對象
|
|
|
|
Obj1 |
(Object 類型) |
複製後的變數對象
4.1.3傳遞參數
l 訪問變數:按值和按引用
l 函數參數傳遞:只有按值
- 向參數傳遞基本類型的值:被傳遞的值複製給一個局部變數(即命名參數,或者
說arguments對象中的一個元素)
2. 向參數傳遞引用類型的值:按值傳遞,雖然局部作用域中修改的對象會在全局作用域中反映出來
【在這個函數內部,obj和person引用的是同一個對象。換句話說,即使這個變數是按值傳遞的,obj也會按引用來訪問一個對象。
如果person是按引用來傳遞的,那麼person就會自動被修改為指向其name屬性值為“Greg”的新對象。
實際上,當在函數內部重寫obj時,這個變數引用的就是一個局部對象了。而這個局部對象會在函數執行完畢後被立即銷毀。】
4.1.4檢測類型
l 檢測基本類型(undefined,字元串,數字,布爾值):tpyeof
l 檢測引用類型:instanceof
如果變數是給定引用類型(根據它的原型鏈來識別)的實例,instanceof操作符返回true
4.2執行環境及作用域
l 執行環境:定義了變數和函數有權訪問的其他數據,決定了它們各自的行為。
1. 每個執行環境都有一個與之關聯的變數對象
2. 全局執行環境是最外圍的一個執行環境
(根據ECMAScript實現所在的宿主環境不同,表示執行環境的對象也不一樣。在web瀏覽器中,全局執行環境被認為是window對象。所有的全局變數和函數都是作為window對象的屬性和方法)
3. 每個函數都有自己的執行環境。
當執行流進入一個函數,函數的環境被推入一個環境棧中。而在函數執行之後,棧將其環境彈出,把控制權返回給之前的執行環境。
l 變數對象(variable object):保存執行環境中定義的所有變數和函數
l 作用域鏈(scope chain):保證對執行環境有權訪問的所有變數和函數的有序訪問
1. 當代碼在一個環境中執行時,會創建變數對象的一個作用域鏈。作用域鏈的前端,都是當前執行代碼所在環境的變數對象。
2. 作用域鏈中的下一個變數對象來自包含環境,而再下一個變數對象則來自下一個包含環境。這樣,一直延續到全局執行環境;全局執行環境的變數對象始終都是作用域鏈中的最後一個對象。