let命令有四大主要特性:存在塊級做用域,沒有變量提高,暫時性死區,不容許重複聲明。函數
這都是和es5的var變量特性相反的。es5
一、存在塊級做用域spa
let命令聲明的變量只在其塊級做用域中有效,就是{}中。code
{ let a = 10; var b = 1; } console.log(a); //出錯 not defined
console.log(b); //1
es5中要實現塊級做用域,一般藉助當即執行匿名函數來實現:blog
(function(){ var a = 1; }()); console.log(a); //出錯,not defined
可是有了let以後,就像C語言同樣,直接就是:作用域
{ let a = 1; } console.log(a); //出錯, not defined
二、沒有變量提高io
也正因如此,變量必須在聲明後使用,不然會報錯。console
console.log(a); //出錯, not defined
let a = 1;
對比var經典的變量提高function
console.log(a); //undefined
var a =1;
三、暫時性死區class
在塊級做用域內,若存在用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; }
四、不容許重複調用
let不能夠在相同做用域內重複聲明同一個變量,也包括不能和var,const變量名重複
let a = 1; let a = 1; //出錯 let不可重複聲明
var b = 1; let b = 1; //出錯 let不可重複聲明
const c = 1; let c = 1; //出錯 let不可重複聲明