let命令有四大主要特性:存在塊級作用域,沒有變量提升,暫時性死區,不允許重復聲明。
這都是和es5的var變量特性相反的。
1、存在塊級作用域
let命令聲明的變量只在其塊級作用域中有效,就是{}中。
{ let a = 10; var b = 1; } console.log(a); //出錯 not defined
console.log(b); //1
es5中要實現塊級作用域,通常借助立即執行匿名函數來實現:
(function(){ var a = 1; }()); console.log(a); //出錯,not defined
但是有了let之后,就像C語言一樣,直接就是:
{ let a = 1; } console.log(a); //出錯, not defined
2、沒有變量提升
也正因如此,變量必須在聲明后使用,否則會報錯。
console.log(a); //出錯, not defined
let a = 1;
對比var經典的變量提升
console.log(a); //undefined
var a =1;
3、暫時性死區
在塊級作用域內,若存在用let命令聲明的變量,則所在區塊對該變量形成封閉作用域,也就是該變量無視外部的同名變量。而又因為不存在變量提升,所以在該區塊中,不能在聲明前使用該變量。
var a = 1; if(true){ a = 2; //出錯 not defined
let a; }
對比var
var a = 1; if(true){ a = 2; //var允許重復聲明,而且變量提升,故a=2正常賦值
var a; }
4、不允許重復調用
let不可以在相同作用域內重復聲明同一個變量,也包括不能和var,const變量名重復
let a = 1; let a = 1; //出錯 let不可重復聲明
var b = 1; let b = 1; //出錯 let不可重復聲明
const c = 1; let c = 1; //出錯 let不可重復聲明
