一、let的用法和var相似,但要注意以下几点
1.变量提升
//var
console.log(a);
var a = 10;//undefined
//变量提升相当于如下代码:
var b;//声明提到了前面,赋值留在原来的位置
console.log(b);//undefined,在赋值前对b进行了打印,结果是undefined
b = 20;//对b进行赋值
console.log(b);//20,如果现在打印,可以得到b的值是20
//let没有变量提升,在声明前使用变量会报错
console.log(c);
let c = 30;//报错Uncaught ReferenceError: Cannot access 'a' before initialization
2.块级作用域
ES5只有全局作用域和函数作用域,ES6新增了块级作用域“{}”。
function foo() {
let n = 5;
if (1) {
let n = 10;
}
console.log(n); // 5,如果是var的情况则打印10
}
function fn() {
let a = 6;
if (1) {
let a = 8;
console.log(a)//8
}
console.log(a); //6
}
3.暂时性死区
如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
var tmp = 123;
if (1) {
tmp = 'abc'; // Uncaught ReferenceError: Cannot access 'tmp' before initialization
let tmp;
}
二、const声明
const声明一个只读的常量。一旦声明,常量的值就不能改变。
const a=1;
a=2;//报错Uncaught TypeError: Assignment to constant variable.