標籤:
變數聲明
ECMAScript中的變數是弱類型的(同一個變數可以儲存任何資料類型)。
- 通過var關鍵字來定義變數;
- 未經過初始化的變數的預設值是undefined;
- 使用var聲明的變數是當前範圍的局部變數(如果在函數中定義一個變數,在函數執行完成後該變數就會被銷毀);
- 沒通過var關鍵字聲明的變數會被自動聲明為全域變數。
1 // 3 2 var iNum; 3 console.log(iNum); // undefined 4 5 // 4 6 function fnTest(){ 7 var sMsg = ‘hum‘; 8 console.log(sMsg); // hum 9 }10 fnTest();11 console.log(sMsg); // sMsg is not defined12 13 // 514 function fnTest1(){15 sMsg1 = ‘hum‘; // 未通過var關鍵字聲明的變數16 console.log(sMsg1); // hum17 }18 fnTest1();19 console.log(sMsg1); // hum 在函數外部能訪問
NOTE:為聲明的變數只能進行typeof和delete操作,其他任何操作都會拋出錯誤。
1 console.log(typeof iName); // undefined2 console.log(delete iName); // true(居然返回true)3 console.log(iName); // iName is not defined
strict 模式注意事項:
- 給未經聲明的變數賦值會拋出ReferenceError錯誤;
- 聲明名為eval和arguments的變數會導致語法錯誤;
- 給未聲明的變數進行delete操作會導致語法錯誤。
變數類型ECMAScript由三種單一資料型別(Boolean、Number、String)、兩種特殊類型(Undefined、Null)和一種複雜資料類型(Object)組成。typeof操作符檢測VARIANT 資料型別返回的結果類型:
- undefined(變數未定義或定義了未賦值);
- boolean(布爾值);
- string(字串);
- number(數值);
- object(對象或null);
- function(函數);
變數範圍要深入理解範圍我們先來看看執行環境和範圍鏈。每個執行環境都有一個與之關聯的變數對象,環境中定義的所有變數和函數都儲存在這個對象中(該對象存在後台,代碼無法訪問)。 全域執行環境:ECMAScript的宿主環境(瀏覽器就是window),全域執行環境在程式退出時才會被銷毀。 局部執行環境:每個函數都有自的執行環境,函數執行時,函數會被推入一個環境棧中。函數執行完成後,環境棧被彈出,把控制權交給之前的執行環境。代碼進入一個執行環境時會建立變數對象的一個範圍鏈。該範圍鏈的前端是當前執行環境的變數對象,下一個是外部執行環境的變數對象,一直到全域執行環境的變數對象。 標識符解析是沿著範圍鏈一級一級向上檢索,直到找到該標識符為止(如果沒有找到就會發生錯誤)。
1 var iNum1 = 1; 2 3 function fnOuter(){ 4 var iNum2 = 11; 5 6 function fnInner(){ 7 var iNum3 = 111; 8 9 console.log(iNum1); // 範圍鏈尋找:fnInner(無)->fnOuter(無)->window(1)10 console.log(iNum2); // 範圍鏈尋找:fnInner(無)->fnOuter(11)11 console.log(iNum3); // 範圍鏈尋找:fnInner(111)12 }13 fnInner();14 15 console.log(iNum1); // 範圍鏈尋找:fnOuter(無)->window(1)16 console.log(iNum2); // 範圍鏈尋找:fnOuter(11)17 console.log(iNum3); // 範圍鏈尋找:fnOuter(無)->window(無)報錯18 }19 fnOuter();20 console.log(iNum1); // 範圍鏈尋找:window(1)21 console.log(iNum2); // 範圍鏈尋找:window(無)報錯22 console.log(iNum3); // 範圍鏈尋找:window(無)報錯變數聲明提升ECMAScript進入一個執行環境會把執行環境中所有的變數的聲明提升到當前範圍的最前端。表現一:變數聲明提升
1 var iNum = 1;2 function fnTest(){3 console.log(iNum); // undefined4 var iNum = 11;5 }6 fnTest();
上面的代碼輸出了undefined。原因是當執行函數fnTest時會檢索函數中所有變數的聲明並優先執行。上面的代碼就類似於下面的代碼。
var iNum = 1; function fnTest(){ var iNum; // **變數聲明提升 console.log(iNum); // undefined iNum = 11; } fnTest();
js中變數注意事項