js作用域及var與無var的區別
在JS裡的全域性環境就是一個物件,這個物件也是JS執行的根,對瀏覽器中的JS,這個物件就是window物件。對全域性JS語句來說,window物件就相當於當前作用域。
當我們寫下:
1 |
|
就是定義了window作用域的一個變數MyJs,當我們這樣寫:
1 |
|
就是定義了window作用域的一個屬性MyJs。
從上面看,window作用域的一個變數MyJs與window作用域的一個屬性MyJs幾乎等價,對於全域性的js語句來說加var與不加沒什麼區別,但在函式體內的語句加與不加就有區別了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
var MyLike = 'JS' ;
|
從上面我們可以看出有var 修飾的在函式內外表現出兩個東西,沒有var修飾的只表現出一個東西,它的值函式內外都可以改變。上面有個undefined大家應該會覺得很奇怪,為什麼不是C#。上面說過,在JS全域性語句中有var 的就是一個變數,沒有的就是一個屬性。變數是有作用域的,程式碼進去下面的函式中,就相當於在當前作用域中建立了一個子作用域。JS引擎首先會把自定義函式建立為作用域上的變數函式,對所有的var 定義的變數,預編譯的時候都會定義為undefined,JS遇到變數和函式時會首先在當前作用域找,沒找到再往上層找,而var MyLike = 'JS';說明已經存在,初始值定義為undefined,var MyLike = 'JS'賦值在輸出的後面,所以為undefined。