var聲明變數的作用域限制在其聲明位置的上下文中 let 聲明的變數只在其聲明的塊或子塊中可用,var的作用域是整個封閉函數 在 ECMAScript 2015 中,let綁定不受變數提升的約束,這意味著let聲明不會被提升到當前執行上下文的頂部。 在塊中的變數初始化之前,引用它將會導致 Refer ...
var聲明變數的作用域限制在其聲明位置的上下文中
var x = 0; // x是全局變數,並且賦值為0。 console.log(typeof z); // undefined,因為z還不存在。 function a() { // 當a被調用時, var y = 2; // y被聲明成函數a作用域的變數,然後賦值成2。 console.log(x, y); // 0 2 function b() { // 當b被調用時, x = 3; // 全局變數x被賦值為3,不生成全局變數。 y = 4; // 已存在的外部函數的y變數被賦值為4,不生成新的全局變數。 z = 5; // 創建新的全局變數z,並且給z賦值為5。 } // (在嚴格模式下(strict mode)拋出ReferenceError) b(); // 調用b時創建了全局變數z。 console.log(x, y, z); // 3 4 5 } a(); // 調用a時同時調用了b。 console.log(x, z); // 3 5 console.log(typeof y); // undefined,因為y是a函數的本地(local)變數。
let 聲明的變數只在其聲明的塊或子塊中可用,var的作用域是整個封閉函數
function varTest() { var x = 1; if (true) { var x = 2; // 同樣的變數! console.log(x); // 2 } console.log(x); // 2 } function letTest() { let x = 1; if (true) { let x = 2; // 不同的變數 console.log(x); // 2 } console.log(x); // 1 }
在 ECMAScript 2015 中,let
綁定不受變數提升的約束,這意味著let
聲明不會被提升到當前執行上下文的頂部。
在塊中的變數初始化之前,引用它將會導致 ReferenceError
(而使用 var 聲明變數則恰恰相反,該變數的值是 undefined )
當在塊中使用時,let
將變數的作用域限製為該塊。註意var
的作用域在它被聲明的函數內的區
var a = 1; var b = 2; if (a === 1) { var a = 11; // the scope is global let b = 22; // the scope is inside the if-block console.log(a); // 11 console.log(b); // 22 } console.log(a); // 11 console.log(b); // 2
const 常量必須在聲明的同時指定它的值.
const
聲明創建一個值的只讀引用。但這並不意味著它所持有的值是不可變的(如引用內容是對象),只是變數標識符不能重新分配
一個常量不能和它所在作用域內的其他變數或函數擁有相同的名稱
// 註意: 常量在聲明的時候可以使用大小寫,但通常情況下全部用大寫字母。 // 定義常量MY_FAV並賦值7 const MY_FAV = 7; // 報錯 MY_FAV = 20; // 輸出 7 console.log("my favorite number is: " + MY_FAV); // 嘗試重新聲明會報錯 const MY_FAV = 20; // MY_FAV 保留給上面的常量,這個操作會失敗 var MY_FAV = 20; // 也會報錯 let MY_FAV = 20; // 註意塊範圍的性質很重要 if (MY_FAV === 7) { // 沒問題,並且創建了一個塊作用域變數 MY_FAV // (works equally well with let to declare a block scoped non const variable) let MY_FAV = 20; // MY_FAV 現在為 20 console.log('my favorite number is ' + MY_FAV); // 這被提升到全局上下文並引發錯誤 var MY_FAV = 20; } // MY_FAV 依舊為7 console.log("my favorite number is " + MY_FAV); // 常量要求一個初始值 const FOO; // SyntaxError: missing = in const declaration // 常量可以定義成對象 const MY_OBJECT = {"key": "value"}; // 重寫對象和上面一樣會失敗 MY_OBJECT = {"OTHER_KEY": "value"}; // 對象屬性並不在保護的範圍內,下麵這個聲明會成功執行 MY_OBJECT.key = "otherValue"; // 也可以用來定義數組 const MY_ARRAY = []; // It's possible to push items into the array // 可以向數組填充數據 MY_ARRAY.push('A'); // ["A"] // 但是,將一個新數組賦給變數會引發錯誤 MY_ARRAY = ['B']
以上內容摘錄MDN Web文檔 未完待續