1.let、const命令(学习阮一峰ES6记录)

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一样,不做说明。

  

 

posted @ 2022-10-09 15:15  奔跑的哈密瓜  阅读(134)  评论(0)    收藏  举报