ES6中新增了let命令,用于声明变量。但是声明的变量只在let的代码块作用域范围内有效。
使用var定义的变量,会发生变量提升现象,即在变量声明之前使用变量,得到的值为undefined。而let声明的变量只能在声明之后使用,否则会报错。
只要块级做作用域内存在let和const命令,它所声明的变量就绑定这个区域,不再受外部的影响。这种现象被称为暂时性死区
var a;
{
a = 1; //ReferenceError
let a;
}
let不允许在相同的作用域内重复声明一个变量。
const声明一个只读常量。一旦声明,常量的值就不能改变
在ES5中没有块级作用域,因为内部作用域中声明的变量可能会覆盖外部作用域中的声明,同时内部作用域中的变量的作用域会扩散到外部,引发歧义。
在外层作用域中无法读取内层作用域的变量,内层作用域中可以定义与外层作用域同名的变量。
函数声明会被自动提升到作用域顶部
(1)在ES5中,函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域中声明,因为在块级作用域中使用function声明函数同样会发生覆盖外层同名函数的结果。
(2)在ES6中,在块级作用域中使用function声明函数的行为类似于let。
在块级作用域前加上do可以是使它变成do表达式,即可以返回值的块级作用域
let x = do {
return 2;
}