以下内容参考:
阮一峰 ECMAScript 6 入门
建议您阅读以上文章,它更为详细
let命令 ##:
只在命名它的代码块中有效,并且和const一样,不会发生变量提升和重复声明一个变量,这也就说明:在声明一个变量之前,这个变量都不可获取;
与var的区别: var声明的变量会发生 变量提升;我们在声明它之前可以获取到变量,由于变量提升它被定义为undefined;
let命声明的变量只在它声明的代码块中有效:
if(true){
let a = 1;
var b =2;
}
console.log(a);//Uncaught ReferenceError: a is not defined
//let声明的变量只在声明时所在的代码有效;所以这里会报错;
console.log(b); // 2
let声明的变量不会发生变量提升:
if(true){
console.log(a);//Uncaught ReferenceError: a is not defined
console.log(b);//undefined
let a =1;
var b =2;
}
上面的代码也会报错,因为在let 声明变量之前,这个变量都是不可获取;
let不允许重复声明一个变量:
//报错
if(true){
let a =1;
let a =2;
}
//报错
if(true){
var a =1;
let a =2;
}
//而var是可以的
if(true){
var a =1;
var a =2;
}
const命令
const声明的变量只是一个可读的变量,这意味着你不能重新赋值const命令声明的变量;
if(true){
const a= 1;
a =2;//报错
}
上面会报错,因为const声明的变量不需要重新赋值,因为不运行重新赋值,所以我们在用cosnt声明变量的时候,要立刻初始化;
if(true){
const a;
a =1;
}
这段代码会报错,因为const不允许变量被重新赋值,它只能被读取;
//正确的声明方式
if(true){
cosnt a =1;
}
和let一样cosnt命令的有效区也仅限于声明它时所在的代码块中;
if(true){
const a =1;
}
console.log(a);//报错,
if(true){
const a =1;
console.log(a);//1
}
const也不会发生变量提升:
if(true){
console.log(a);//报错
const a =1;
}
const也不允许重复命令一个变量:
if(true){
var a =1;
const a =2;//报错
}
暂时性死区
只要在块级作用域内存在let或cosnt命令声明的变量,它们声明的变量就会绑定这个块级作用;也就是不受外部变量的影响;
var a =1;
if(true){
console.log(a); //Uncaught ReferenceError: a is not defined
let a = 1;
上面的代码在打印a变量时,报错,原因是在let声明的变量a不受外部变量a的影响;let没有变量提升,所有在声明之前获取就会报错;
引用一段话:
ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
在let或const声明的变量之前,这个变量都不可以获取,这在语法上就叫 “暂时性死区”,也就是typeof()也不是一个百分比百的操作;
if(true){
type of(a); //报错
let a =1;
}