一、變量
定義
變量是松散型的
變量是保存特定值的一個名字
變量包含兩種數據類型的值:基本數據類型的值和引用數據類型的值
基本數據類型值
基本數據類型值是一個簡單的數據段,在內存中占用固定的空間,保存在棧內存中,當復制基本數據類型值的時候,js會創建一個當前值的副本,復制和被復制的值是完全獨立的
引用數據類型值
引用數據類型值是多個值構成的對象,保存在堆內存中,引用數據類型的值是可以動態添加屬性和方法的,當復制引用數據類型值的時候,復制的是一個內存地址(指針),復制的值和被復制的值都指向存儲在堆內存中的同一個對象,包含引用數據類型值的變量其實包含的不是對象本身,而是該對象的內存地址,操作的是對象的引用的內存地址,而不是對象本身
訪問變量
訪問變量是按照值類型訪問或者引用類型訪問,值訪問是直接查找棧內存中是否有這個值,引用類型訪問是通過對象的內存地址查找保存在堆中的這個對象中是否有這個值。
傳遞變量
js中的參數傳遞只能是值傳遞,參數傳遞的過程其實就是值復制的過程,如果傳遞的參數是一個對象,那么就會把實參(對象)的內存地址復制給形參,這個內存地址是一個值,在作用域內形參的屬性值發生變化后,實參的屬性值也會發生變化。在這個過程中變量的值得類型是引用類型,但是傳遞的參數是一個值(內存地址),所以參數傳遞是值傳遞。
二、作用域
- 每一個作用域都有一個與之關聯的變量對象,作用域中定義的變量和函數都會保存在這個對象中
- 所有變量都存在于某一個作用域中,作用域決定了變量的生命周期
- 作用域分為全局作用域和函數作用域(局部作用域)
- 局部作用域能訪問本身作用域中的變量,也能訪問父級作用域和全局作用域
- 全局作用域只能訪問全局作用域中定義的變量和函數,不能直接訪問局部作用域中的任何數據
- 變量的作用域有助于確定何時釋放內存
- 每一個作用域都有一個用于搜索變量和函數的作用域鏈
- 某些語句可以在作用域鏈前端臨時添加一個變量對象來延長作用域鏈,該變量對象會在代碼執行后被移除。
- 在js文件中引用另外一個js文件中的變量也會延長作用域鏈
- js沒用塊級
三、內存
js具有自動垃圾回收機制,js所用的垃圾收集方式是標記清除,垃圾收集器在運行時,會給存儲在內存中的所以變量加上標記,然后他會去掉作用域中的變量以及被作用域中的變量引用的變量的標記,而在此之后再被加上標記的變量而被視為將要刪除的變量,原因是作用域中的變量已經無法訪問到這些變量了。
解除引用可以確保有效的回收內存,數據不再有用時,最好釋放其內存。