標籤:boolean 訪問 obj 錯誤 border 代碼執行 cell 問題 代碼
變數、範圍和記憶體問題
- 基本類型和參考型別的值
(1)基本類型:按值訪問(Undefined、Null、Boolean、Number、String)
(2)參考型別:按引用訪問
|
基本類型 |
參考型別 |
動態屬性 |
不能給基本類型的值添加屬性 |
動態添加、改變、刪除屬性和方法 |
複製變數值 |
在變數對象上建立一個新值,然後將該值複製到新變數分配的位置上(互不影響) |
複製結束兩個變數引用一個對象(互相關聯) |
傳遞參數 |
把函數外部的值複製給函數內部的參數 |
把這個值的記憶體位址複製給另一個局部變數 |
檢測類型 |
使用typeof 檢測基本類型,如果是null或對象,會返回“object”====返回的是string類型 |
使用instanceof 檢測具體的類型:對象、數組或者正則等。文法:result = variable instanceof constructor。 |
- 執行環境及範圍
執行環境定義了變數或函數有權訪問其他資料,決定了它們各自的行為;都有一個與之關聯的變數對象,環境中定義的所有變數和函數都儲存在這個對象中。
所有全域變數和函數都是作為window對象的屬性和方法建立的。某個執行環境中的所有代碼執行完畢後,該環境被銷毀,儲存在其中的所有變數和函數定義也隨之銷毀。
代碼在一個環境中執行時,會建立變數對象的範圍鏈,保證對執行環境有權訪問的所有變數和函數的有序訪問。
內部環境可以通過範圍鏈訪問所有的外部環境,但外部環境不能訪問內部環境中的任何變數和函數。環境之間的聯絡是線性有次序的,只可以向上搜尋範圍鏈,以查詢變數和函數名;下級的範圍鏈中包含的對象:自己的變數對象和上級的變數對象,直到全域變數對象。
標識符解析是沿著範圍鏈一級一級地搜尋標識符的過程。搜尋過程從更範圍鏈的前端開始,然後逐級地向後回溯,知道找到標識符位置,若找不到,會導致錯誤。
延長範圍鏈
執行環境的類型:全域和局部;
延長範圍鏈:有些語句可以在範圍鏈的前端臨時增加一個變數對象,該變數對象會在代碼執行後被移除。在下列兩種語句會加長範圍鏈:
- try-catch語句的catch塊(建立一個新的變數對象,包含拋出的錯誤對象聲明)
- with語句(將指定對象添加到範圍鏈中)
沒有塊級範圍
變數是被添加到當前的執行環境中的,
使用var聲明的變數會被自動添加到最近的環境中,在函數內部,最近的是函數的局部環境;with語句中,最接近的是函數環境,沒有使用var初始化的,會自動添加到全域環境(不建議這樣使用,strict 模式下,初始化未經聲明的變數會導致錯誤)。
查詢標識符
標識符(變數名):查詢時,先在局部環境中尋找,沒找到則繼續向上搜尋,一直到全域環境的變數對象,若還沒找到,則是該變數尚未聲明。若找到,則停止搜尋,不在進入下一個變數對象。(局部環境有,則不使用父級的標識符)
- 垃圾收集
JavaScript具有自動垃圾收集機制。
標記清除(最常用的垃圾收集方式)
可以用任何方式來標記變數
引用計數
追蹤記錄每一個值被引用的次數。代碼存在循環參考現象時,不適用。
JavaScript第四章