let和const命令
let命令是在它所在的程式碼塊有效,它屬於塊級作用域,es6新增。es5只有全域性作用域和函式作用域。let命令存在暫時性死區(TDZ),即在申明前使用就會報錯,不存在變數提升
console.log(a); // 報錯
let a = 111;
複製程式碼
==let不允許在相同作用域中,重複申明同一變數==
塊級作用域和函式宣告
es6中明確規定在塊級作用域中可以宣告函式,在塊級作用域中,函式宣告語句的行為類似於let,在塊級作用域外不可引用。以下是es6中對函式宣告做的規定
- 允許在塊級作用域內宣告函式。
- 函式宣告類似於
var
,即會提升到全域性作用域或函式作用域的頭部。 - 同時,函式宣告還會提升到所在的塊級作用域的頭部。
看下面一段程式碼
// ES6 環境
function f() { console.log('I am outside!'); }
(function () {
if (false) {
function f() { console.log('I am inside!'); }
}
f();
}());
// Uncaught TypeError: f is not a function
複製程式碼
會報錯,應該塊級作用域中的函式宣告類似於var,會被提升到塊級作用域頭部,下面是實際執行程式碼
//ES6 環境
function f() { console.log('I am outside!'); }
(function () {
var f = undefined;
if (false) {
function f() { console.log('I am inside!'); }
}
f();
}());
// Uncaught TypeError: f is not a function
複製程式碼
所以要避免在塊級作用域中宣告函式,如果必須的話使用函式表示式
const命令
const
宣告一個只讀的常量,宣告後不可改變,需要注意的是const只是保證宣告的變數指向的那塊記憶體空間儲存的資料不能改動,對於複合型資料(物件和陣列),變數指向的記憶體地址,儲存的是一個指向實際資料的指標,const
只能保證這個指標是固定的,指標指向的資料結構是可以變的,因此物件可以新增屬性,陣列可以新增資料,但是他們不能賦給另一個變數
const foo = {};
// 為 foo 新增一個屬性,可以成功
foo.prop = 123;
foo.prop // 123
// 將 foo 指向另一個物件,就會報錯
foo = {}; // TypeError: "foo" is read-only
複製程式碼
es6中有六中宣告變數的方法:var
命令和function
命令,let
和const
,還有import
命令和class
命令
es5中頂層物件和全域性變數是掛鉤的,全域性宣告的變數是頂層物件的屬性,es6中let,const,class命令宣告的全域性變數不在是全域性變數的屬性