let const
let 声明变量,但只在代码块之内有效;
// An highlighted block
{
let a = 1;
}
console.log(a) // ReferenceError: a is not defined.
let不存在变量提升;
变量提升,指的是变量可以在声明之前使用,值为undefined,使用var声明变量就有这个问题,而let则必须要先声明才可以使用,否则就会报错。
console.log(a) //输出undefined
var a = 1;
console.log(b)
let b = 2; //Uncaught ReferenceError: Cannot access 'b' before initialization
暂时性死区;
var a = 1;
if(true){
a = 2; // Uncaught ReferenceError: Cannot access 'a' before initialization
let a;
}
上面代码中,存在全局变量a,但是块级作用域内let又声明了一个局部变量a,导致后者绑定这个块级作用域,所以在let声明变量前,对a赋值会报错。
ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。
不允许重复声明;
let不允许在相同作用域内,重复声明同一个变量。
var a = 1;
let a = 2;
// Uncaught SyntaxError: Identifier 'a' has already been declared
let a = 1;
let a = 2;
// Uncaught SyntaxError: Identifier 'a' has already been declared
也不允许在函数里面重新声明参数;
function name(msg){
let msg = msg || 1;
}
name('233')