天天看點

JavaScript之變量、作用域

一.變量

1.基本類型值和引用類型值

 js和其他語言一樣也分值類型和引用類型。在基本概念那篇部落格也紀錄了五種常見的基本資料類型:undefined、null、boolean、number、string。這五種都是按值通路的基本資料類型,可以操作保持在變量中的實際的值.(js和其他語言c#不同的是string也是基本資料類型)。

引用類型的值是儲存在記憶體中的對象。js不允許直接通路記憶體中的對象,不能直接操作對象的記憶體空間。操作對象是是操作的對象的引用。對于引用類型的值可以為它動态的添加屬性。

2.變量值的拷貝

這個和c#的類似,基本資料類型是直接建立一個新的變量,對于引用類型是将變量指向指派對象的堆位址。

3.傳遞參數

js中所有的函數的參數都是按值傳遞。把函數外部的值複制給函數内部的參數。傳遞參數和變量值拷貝一樣。在向函數傳遞引用類型的值時,會把這個值在記憶體中的位址複制給一個局部變量,這個局部變量的變化會反映在函數外部(類似c#)。

4.檢測類型

要檢測一個基本類型的變量用typeof是極好的,但對于一個對象或null,用type始終傳回object,這樣就不是極好的了。這時候instanceof出場了。有了它可以檢測出它是什麼類型的對象,是數組、還是正則等。

二、執行環境和作用域

1. 執行環境定義了變量或函數有權通路的其他資料。每個執行環境都有一個與之關聯的變量對象,環境中定義的所有變量和函數都儲存在這個對象中。

全局執行環境是最外圍的一個執行環境。宿主不同所表示的執行環境的對象也不一樣。在web浏覽器中,全局執行環境被認為是window對象。

每個函數都有自己的執行環境。當執行流進入一個函數時,函數的環境就被推入一個環境棧中,當函數執行之後,棧将其彈出,把控制權交給之前的執行環境。

作用域鍊書上介紹的有點過于仔細,意思和生命周期差不多,就是看你這個變量能被通路的地方。

用try-catch、with來延長作用域鍊。

2.js沒有塊級作用域

JavaScript之變量、作用域

看到上面代碼測試可能做過c#這些的會感到奇怪,包括我。其實在js中一點也不奇怪。在js中是沒有塊級作用域。用var聲明的變量會添加到最近的環境中,在函數内部,最接近的的環境是函數的局部環境,在with語句中,最接近的環境是函數環境。如果未使用var聲明,變量會自動添加到全局變量中。

繼續閱讀