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不可重复声明