【學習筆記】四:變量、作用域和內存問題
1.引用類型的值
引用類型的值是指保存在內存中的對象,JavaScript不允許直接訪問內存中的位置,因此在操作對象時,實際上是操作的引用而不是實際的對象。(嚴密的說法是:當復制保存著對象的某個變量時,操作的是對象的引用。但為對象添加屬性時,操作的是實際對象)。
1)引用類型可以動態添加屬性。
2)引用類型在復制變量值時,復制的是對象的指針,新復制的變量和原來的變量保存的值只想內存中的同一個對象,因此改變其一,另一 個也變。
3)所有函數的參數都是按值傳遞的,包括引用類型的傳遞。引用類型傳遞的雖然是是對象的內存地址,但是在函數中如果參數的指向重新賦值後改變參數的屬性並不會引起所傳遞值得屬性,說明引用類型也是按值傳遞的。
4)通過typeof檢測基本類型,通過instanceof檢測引用類型的值。
2.執行環境及作用域
1)執行環境是一個變量或函數可以在其中操作的一個範圍環境(就是類C語言中的作用域),每一個執行環境都有一個與之關聯的變量對象,環境中的這些變量和函數都保存在這個對象中。
每個函數都有一個執行環境,函數在執行時會變推入一個環境棧中,函數執行後,棧將其彈出。
變量對象的父子關系之間組成了一個作用域鏈。作用域鏈的最前端是當前活動對象,在尋找變量時首先在當前執行環境中尋找,如果找不到,到期上一級父環境中尋找,直至找到標識符位置(如果找不到通常會導致錯誤發生)。
2) 當使用try-catch語句的catch塊和with語句時存在作用域鏈延長的現象,會在作用域鏈的前端臨時增加一個變量對象(不過不常見)。
3)JavaScript沒有塊級作用域,只有全局執行環境和函數執行環境之分,不能像類C語言那樣中括號就可以確定一個作用域。如:if(true){
var color = "blue";
}
alert(color); //"blue"
if 語句結束後,變量color依舊存在於if的執行環境中。
3.垃圾收集
1)常用得了兩種回收策略:標記清除和引用計數(引用計數存在循環引用問題,基本上已經不采用了),但在IE9之前的IE瀏覽器訪問非原生JS對象(如DOM元素)時,依舊使用了這種可能存在問題的回收策略。
2)性能問題:垃圾收集器的調用間隔影響性能。垃圾回收期的調用方式一般由瀏覽器自己判斷。
3)系統為Web瀏覽器比較少,為了確保占用最少的內存讓頁面獲得更好的性能,一旦全局變量和全局對象不再使用,最好將其設為null來釋放其引用,幫助垃圾收集器回收。
【學習筆記】四:變量、作用域和內存問題