JavaScript let 和 const
JavaScript let 和 const
ECMAScript 2015(ECMAScript 6)
ES2015(ES6) 新增加了兩個重要的 JavaScript 關鍵字: let 和 const。
let 宣告的變數只在 let 命令所在的程式碼塊內有效。
const 宣告一個只讀的常量,一旦宣告,常量的值就不能改變。
在 ES6 之前,JavaScript 只有兩種作用域: 全域性變數 與 函式內的區域性變數。
全域性變數
在函式外宣告的變數作用域是全域性的:
例項
全域性變數在 JavaScript 程式的任何地方都可以訪問。
區域性變數
在函式內宣告的變數作用域是區域性的(函式內):
例項
函式內使用 var 宣告的變數只能在函式內容訪問,如果不使用 var 則是全域性變數。
JavaScript 塊級作用域(Block Scope)
使用 var 關鍵字宣告的變數不具備塊級作用域的特性,它在 {} 外依然能被訪問到。
{ var x = 2; } // 這裡可以使用 x 變數
在 ES6 之前,是沒有塊級作用域的概念的。
ES6 可以使用 let 關鍵字來實現塊級作用域。
let 宣告的變數只在 let 命令所在的程式碼塊 {} 內有效,在 {} 之外不能訪問。
{ let x = 2; } // 這裡不能使用 x 變數
重新定義變數
使用 var 關鍵字重新宣告變數可能會帶來問題。
在塊中重新宣告變數也會重新宣告塊外的變數:
例項
let 關鍵字就可以解決這個問題,因為它只在 let 命令所在的程式碼塊 {} 內有效。
例項
瀏覽器支援
Internet Explorer 11 及更早版本的瀏覽器不支援 let 關鍵字。
下表列出了各個瀏覽器支援 let 關鍵字的最低版本號。
Chrome 49 | IE / Edge 12 | Firefox 44 | Safari 11 | Opera 36 |
Mar, 2016 | Jul, 2015 | Jan, 2015 | Sep, 2017 | Mar, 2016 |
迴圈作用域
使用 var 關鍵字:
例項
使用 let 關鍵字:
例項
在第一個例項中,使用了 var 關鍵字,它宣告的變數是全域性的,包括迴圈體內與迴圈體外。
在第二個例項中,使用 let 關鍵字, 它宣告的變數作用域只在迴圈體內,迴圈體外的變數不受影響。
區域性變數
在函式體內使用 var 和 let 關鍵字宣告的變數有點類似。
它們的作用域都是 區域性的:
// 使用 var function myFunction() { var carName = "Volvo"; // 區域性作用域 } // 使用 let function myFunction() { let carName = "Volvo"; // 區域性作用域 }
全域性變數
在函式體外或程式碼塊外使用 var 和 let 關鍵字宣告的變數也有點類似。
它們的作用域都是 全域性的:
// 使用 var var x = 2; // 全域性作用域 // 使用 let let x = 2; // 全域性作用域
HTML 程式碼中使用全域性變數
在 JavaScript 中, 全域性作用域是針對 JavaScript 環境。
在 HTML 中, 全域性作用域是針對 window 物件。
使用 var 關鍵字宣告的全域性作用域變數屬於 window 物件:
例項
使用 let 關鍵字宣告的全域性作用域變數不屬於 window 物件:
例項
重置變數
使用 var 關鍵字宣告的變數在任何地方都可以修改:
例項
在相同的作用域或塊級作用域中,不能使用 let 關鍵字來重置 var 關鍵字宣告的變數:
var x = 2; // 合法 let x = 3; // 不合法 { var x = 4; // 合法 let x = 5 // 不合法 }
在相同的作用域或塊級作用域中,不能使用 let 關鍵字來重置 let 關鍵字宣告的變數:
let x = 2; // 合法 let x = 3; // 不合法 { let x = 4; // 合法 let x = 5; // 不合法 }
在相同的作用域或塊級作用域中,不能使用 var 關鍵字來重置 let 關鍵字宣告的變數:
let x = 2; // 合法 var x = 3; // 不合法 { let x = 4; // 合法 var x = 5; // 不合法 }
let 關鍵字在不同作用域,或不同塊級作用域中是可以重新宣告賦值的:
let x = 2; // 合法 { let x = 3; // 合法 } { let x = 4; // 合法 }
變數提升
JavaScript 中,var 關鍵字定義的變數可以在使用後宣告,也就是變數可以先使用再宣告(JavaScript 變數提升)。
例項
let 關鍵字定義的變數則不可以在使用後宣告,也就是變數需要先宣告再使用。
// 在這裡不可以使用 carName 變數 let carName;
const 關鍵字
const 用於宣告一個或多個常量,宣告時必須進行初始化,且初始化後值不可再修改:
例項
const
定義常量與使用let
定義的變數相似:
- 二者都是塊級作用域
- 都不能和它所在作用域內的其他變數或函式擁有相同的名稱
兩者還有以下兩點區別:
const
宣告的常量必須初始化,而let
宣告的變數不用- const 定義常量的值不能通過再賦值修改,也不能再次宣告。而 let 定義的變數值可以修改。
var x = 10; // 這裡輸出 x 為 10 { const x = 2; // 這裡輸出 x 為 2 } // 這裡輸出 x 為 10
const 宣告的常量必須初始化:
// 錯誤寫法 const PI; PI = 3.14159265359; // 正確寫法 const PI = 3.14159265359;
並非真正的常量
const 的本質: const 定義的變數並非常量,並非不可變,它定義了一個常量引用一個值。使用 const 定義的物件或者陣列,其實是可變的。下面的程式碼並不會報錯:
例項
但是我們不能對常量物件重新賦值:
例項
以下例項修改常量陣列:
例項
但是我們不能對常量陣列重新賦值:
例項
瀏覽器支援
Internet Explorer 10 及更早版本的瀏覽器不支援 const 關鍵字。
下表列出了各個瀏覽器支援 const 關鍵字的最低版本號。
Chrome 49 | IE / Edge 11 | Firefox 36 | Safari 10 | Opera 36 |
Mar, 2016 | Oct, 2013 | Feb, 2015 | Sep, 2016 | Mar, 2016 |
重置變數
使用 var 關鍵字宣告的變數在任何地方都可以修改:
例項
在相同的作用域或塊級作用域中,不能使用 const 關鍵字來重置 var 和 let關鍵字宣告的變數:
var x = 2; // 合法 const x = 2; // 不合法 { let x = 2; // 合法 const x = 2; // 不合法 }
在相同的作用域或塊級作用域中,不能使用 const 關鍵字來重置 const 關鍵字宣告的變數:
const x = 2; // 合法 const x = 3; // 不合法 x = 3; // 不合法 var x = 3; // 不合法 let x = 3; // 不合法 { const x = 2; // 合法 const x = 3; // 不合法 x = 3; // 不合法 var x = 3; // 不合法 let x = 3; // 不合法 }
const 關鍵字在不同作用域,或不同塊級作用域中是可以重新宣告賦值的:
const x = 2; // 合法 { const x = 3; // 合法 } { const x = 4; // 合法 }
變數提升
JavaScript var 關鍵字定義的變數可以在使用後宣告,也就是變數可以先使用再宣告(JavaScript 變數提升)。
例項
const 關鍵字定義的變數則不可以在使用後宣告,也就是變數需要先宣告再使用。
carName = "Volvo"; // 在這裡不可以使用 carName 變數 const carName = "Volvo";