首页 > 其他分享 >let、const命令(学习阮一峰ES6记录)

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

时间:2022-10-09 15:25:22浏览次数:60  
标签:ES6 const 变量 一峰 let var 报错 声明

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

相关文章

  • 探索ES6(ES2015)
    探索ES6(ES2015)本书HTML在线:ExploringES6https://exploringjs.com/es6/index.html是一本关于ECMA-2626thEdition(ECMAScript2015)的最全面的书。是一本为已经了解J......
  • es6 中文
    https://m.w3cschool.cn/escript6/escript6-cx4337fr.htmlhttps://es6-org.github.io/exploring-es6/#./16.7.mdhttps://w3ctech.com/topic/2045......
  • es6
    entries(),keys()和values()用户遍历数组,它们都返回一个遍历器对象,可以用for...of循环进行遍历,唯一的区别是keys()是对键名的遍历;values()是对键值的遍历;entries......
  • es6 模块化
    ES6InDepth是一系列关于ECMAScript标准第6版(简称ES6)中JavaScript编程语言新增功能的文章。不久之前,JavaScript的主要用途是表单验证,可以肯定的是,您的平均<input-onchang......
  • TypeScript super()与constructor()
    super在子类的constructor中调用,是在子类中执行了父类的构造函数,其实是无关父类原型的,如果想到改变父类的原型方法,可以直接重名覆盖,如果想利用父类原型方法,也可以用super.m......
  • django数据模型中关于on_delete,db_constraint的参数说明
    django数据模型中关于on_delete,db_constraint的参数说明1.设置为nullclassBookModel(models.Model):"""图书"""book_name=models.CharField(max......
  • C++ 右值引用与 const 关键字
    C++11新增了另一种引用:右值引用(rvaluereference),这种引用可指向右值,是使用&&声明的。使用右值引用可以减少复制操作,延长临时对象生命周期,提升程序性能。它一般被用来实......
  • js高级ES6class构造函数与super继承
    <!DOCTYPEhtml><htmllang="en"><head> <metacharset="UTF-8"> <metahttp-equiv="X-UA-Compatible"content="IE=edge"> <metaname="viewport"content="width=......
  • leetcode 106. Construct Binary Tree from Inorder and Postorder Traversal 从中序
    一、题目大意给定两个整数数组inorder和postorder,其中inorder是二叉树的中序遍历,postorder是同一棵树的后序遍历,请你构造并返回这颗二叉树。示例1:输入:ino......
  • es6必会之let && const
    关键词:​​let​​​,​​const​​​,​​blockingscope​​​,​​temporaldeadzone​​​,​​redeclaration​​​,​​reassignment​​​,​​immutable​​​,​​ini......