let
và const
có hai điểm khác biệt lớn từ var
:
- Họ là khối phạm vi .
- Truy cập
var
trước khi nó được tuyên bố có kết quả undefined
; truy cập một let
hoặc const
trước khi nó được tuyên bố ném ReferenceError
:
console.log(aVar); // undefined
console.log(aLet); // causes ReferenceError: aLet is not defined
var aVar = 1;
let aLet = 2;
Nó xuất hiện từ các ví dụ này rằng các let
khai báo (và const
, hoạt động theo cùng một cách) có thể không được nâng lên , vì aLet
dường như không tồn tại trước khi nó được gán một giá trị.
Tuy nhiên, đó không phải là trường hợp let
và const
được nâng lên (như var
, class
và function
), nhưng có một khoảng thời gian giữa việc nhập phạm vi và được khai báo ở nơi không thể truy cập được. Thời kỳ này là vùng chết tạm thời (TDZ) .
TDZ kết thúc khi aLet
được khai báo , thay vì được chỉ định :
//console.log(aLet) // would throw ReferenceError
let aLet;
console.log(aLet); // undefined
aLet = 10;
console.log(aLet); // 10
Ví dụ này cho thấy let
được nâng lên:
let x = 'outer value';
(function() {
// start TDZ for x
console.log(x);
let x = 'inner value'; // declaration ends TDZ for x
}());
Tín dụng: Khu vực chết tạm thời (TDZ) bị phá hủy
Truy cập x
trong phạm vi bên trong vẫn gây ra a ReferenceError
. Nếu let
không được nâng lên, nó sẽ đăng nhập outer value
.
TDZ là một điều tốt vì nó giúp làm nổi bật các lỗi mà truy cập vào một giá trị trước khi nó được tuyên bố là hiếm khi có chủ ý.
TDZ cũng áp dụng cho các đối số chức năng mặc định. Các đối số được đánh giá từ trái sang phải và mỗi đối số nằm trong TDZ cho đến khi được chỉ định:
// b is in TDZ until its value is assigned
function testDefaults(a=b, b) { }
testDefaults(undefined, 1); // throws ReferenceError because the evaluation of a reads b before it has been evaluated.
TDZ không được bật theo mặc định trong trình chuyển mã babel.js. Bật chế độ "tuân thủ cao" để sử dụng nó trong REPL . Cung cấp es6.spec.blockScoping
cờ để sử dụng nó với CLI hoặc làm thư viện.
Đề nghị đọc thêm: TDZ đã được làm sáng tỏ và ES6 Let, Const và khu vực tạm thời tạm thời (TDZ) ở độ sâu .