ES6提出了块作用域的概念,那么局部变量也应运而生
var :声明全局变量
let :只在let命令作用的代码块有效
let命令声明的变量不存在变量提升:
var命令声明的变量为全局变量,变量可以在声明前使用而不报错;
而let命令声明的变量必须在声明后才可以使用赋值等
// var 的情况
foo = 2;
console.log(foo); // 输出2
var foo = 3;
// let 的情况
console.log(bar); // 报错ReferenceError
let bar = 2;
let变量声明可能会导致暂时性死区
只要块级作用域内存在let
命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
var tmp = 123;
if (true) {
tmp = 'abc'; // ReferenceError
let tmp;
}
上面代码中,存在全局变量tmp
,但是块级作用域内let
又声明了一个局部变量tmp
,导致后者绑定这个块级作用域,所以在let
声明变量前,对tmp
赋值会报错。
ES6 明确规定,如果区块中存在let
和const
命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
总之,在代码块内,使用let
命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。