一、let聲明的變量,僅在代碼塊內(nèi)有效
下述代碼中i為var聲明,為全局作用域
var a = [];
for (var i = 0; i<10; i++){
a[i]=function(){
console.log(i)
}
}
a[5](); //10
下列代碼中l(wèi)et僅在塊狀作用域內(nèi)有效
var a = [];
for (let i = 0; i < 10; i ++){
a[i] = function(){
console.log(i)
}
}
a[5](); //5
for循環(huán)還有一個(gè)特別之處,就是設(shè)置循環(huán)變量的那個(gè)部分是一個(gè)父級(jí)作用域,而循環(huán)體內(nèi)部是一個(gè)單獨(dú)的自作用域。
for (let i = 0; i < 3; i++){
let i = 'abc';
console.log(i);
}
// 輸出如下:
// abc
// abc
// abc
二、let聲明的變量,不存在變量提升
console.log(test); //undefined
var test = 1;
console.log(test1) // Uncaught ReferenceError: test1 is not defined
let test1 = 1;
三、暫時(shí)性死區(qū)
只要塊級(jí)作用域內(nèi)存在let命令,他所生命的變量就“綁定”這個(gè)區(qū)域,不在受外部影響,不會(huì)再去尋找上一級(jí)作用域是否定義了該變量。以下代碼中,let命令聲明test3之前,都屬于變量test3 的死區(qū)。
if (true){
//TDZ開(kāi)始
test3 = 'abc'; // Uncaught ReferenceError: test3 is not defined
console.log(test3);//Uncaught ReferenceError: test3 is not defined
let test3; //TDZ結(jié)束
console.log(test3); //undefined
test3 = 123;
console.log(123); //123
}
四、不允許重復(fù)聲明
let不允許在相同作用域內(nèi)聲明同一個(gè)變量
//報(bào)錯(cuò)
function abc() {
let a = 10;
var a = 1;
}
//報(bào)錯(cuò)
function abc() {
let a = 10;
let a = 1;
}
//報(bào)錯(cuò)
function abc(arg) {
let arg;
let a = 1;
}
//不報(bào)錯(cuò)
function abc(arg) {
{
let arg;
}
let a = 1;
}
五、let、const、class聲明的全局變量不再屬于頂層對(duì)象(window、global)屬性
let b = 1;
window.b //undefined;
本文內(nèi)容出自:《ES6標(biāo)準(zhǔn)入門(mén)》(阮一峰著)