1.let命令
ES6新增let命令,作用和var类似,用来声明变量,但是let只能在所在代码块(区域)中使用。例:
1 { 2 let a = 2; 3 var b = 3; 4 } 5 console.log(a)// a is not defined 6 console.log(b)//3
在上述代码中可以发现,同样用let和var声明了变量,在代码块之外调用的时候,let声明的变量报错了,var声明的变量返回了值,这就是let的块级作用域。
变量提升
var存在变量提升,即var可以在声明变量之前使用,值不会报错。let如果没有提前声明变量而先使用就会报错。例:
1 console.log(a);//undefined 2 var a = 2; 3 4 console.log(b);//Cannot access 'b' before initialization 5 let b = 3;
可以发现,var声明的变量a,在代码运行时,实际上已经存在,只是没有赋值,所以打印出来是undefined。let声明的变量b,在代码运行时直接报错了,提醒使用在声明之前,所以let是不存在变量提升的。
暂时性死区
在块级作用域内使用了let后,let声明的变量就会和这个会计作用于绑定,也就是说在外部var声明的变量和块级作用域内声明了相同的变量的时候,块级作用域会先认let声明的变量。这个结果导致我们在写代码的时候会突然报错。例:
1 var a =2; 2 { 3 console.log(a);// Cannot access 'a' before initialization 4 let a = 3; 5 }
看上述代码,外部和会计作用域内都声明了变量a,这时候块级作用域会先认let声明的变量,又由于let不存在变量提升,这时候就会报错。
在某些时候,这种报错会出现的猝不及防,我们不仔细看都发现不了这种错误。例:
1 function fun(x=y,y=2){ 2 console.log(x+":"+y); 3 } 4 fun();//Cannot access 'y' before initialization 5 6 function fun(x=2,y=x){ 7 console.log(x+":"+y); 8 } 9 fun();//2:2
上述代码第一个会报错,因为x先使用了y,而当时y还没有被声明。,第二个方法就会打印出结果。
重复声明问题
ES6不允许在同一作用域内重复声明变量,这时候会报错。例:
1 { 2 let a = 2; 3 let a = 3; 4 }//Identifier 'a' has already been declared 5 6 { 7 let a = 2; 8 var a = 3; 9 }//Identifier 'a' has already been declared 10 11 { 12 var a = 2; 13 var a = 3; 14 }//正常 15 16 { 17 var a = 2; 18 let a = 3; 19 }// Identifier 'a' has already been declared
上述代码,第一、二、四都会报错,不允许重复声明,但是在使用var时,是不存在这种情况的,允许声明。
2.const命令
const用来声明常量,一旦声明不可更改。例:
const a = 3; a = 5//Assignment to constant variable.
上述代码,const声明a为3后,再次对a进行赋值,会报错。
const a;//Missing initializer in const declaration
如果使用const直接声明变量,也会报错,他只能用来声明常量。
const的块级作用域、变量提升、重复声明等特性都和let一样,不做说明。
标签:ES6,const,变量,一峰,let,var,报错,声明 From: https://www.cnblogs.com/lisir-blogshare/p/16772227.html