首页 > 其他分享 >ES6笔记 - let和const命令

ES6笔记 - let和const命令

时间:2022-11-25 18:23:07浏览次数:43  
标签:ES6 const 变量 作用域 报错 var let

let和const命令

目录

1. let命令

  • let命令的用法和var类似,其核心特点为只在let所在的代码块内有效。由此衍生出几个特点:
    1. 不存在变量提升

      • 变量提升是指,变量可以在声明之前使用,此时值为undefined
      • let所声明的变量一定要在声明后使用,否则会报错
    2. 不允许重复声明

      //var的情况
      console.log(foo);	//输出undefined
      var foo = 2;
      var foo = 3;
      console.log(foo);	//输出3
      
      //let的情况
      console.log(bar);	//报错
      let bar = 2;
      let bar = 3;		//报错
      

2. const命令

  • const声明一个只读的常量,一旦声明,常量的值就不能变

    const的特性与let极为相似,包括只在命令所在的代码块内有效、不会提升、不允许重复说明

  • const常量一旦声明就必须立刻初始化,否则就会报错

    const foo; //报错
    const foo = 5; //正确
    
  • 将一个数组或对象声明为常量需要小心。和java中的指针一样,const所保证的实际上并不是变量的值不得改动,而是变量指向的内存地址所保存的数据不得改动。正如java中const只能保证指针指向方向,而不能保证所指方向的数据内部能否改变一样。

3. 块级作用域

  • ES5中只有全局作用域和函数作用域,这样就很容易造成变量之间的覆盖或泄露

    let为JS新增了块级作用域,它和Java中的局部作用域有相似之处:

    • 外层代码块不受内层代码块影响
    • 外层作用域无法读取内层作用域的变量
    • 内层作用域可以定义外层作用域的同名变量
    function f1() {
      let n = 5;
      if (true) {
        let n = 10;
      }
      console.log(n); // 5
    }
    
  • 注意

    • 由于各种原因,应该避免在块级作用域内声明函数。如果确实需要,也应该写成函数表达式,而不是函数声明语句

    • ES6的块级作用域必须有大括号,如果没有大括号,JS引擎就不认为存在块级作用域

      // 第一种写法,报错
      if (true) let x = 1;
      
      // 第二种写法,不报错
      if (true) {
        let x = 1;
      }
      

      在上面的代码中,由于let只能出现在当前作用域的”顶层“,而第一种写法将他作为全局作用域中if的子语句,并非”顶层“,所以报错

4. 从function循环问题深入了解let

var a = [];
for (var i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); //输出10
  • 这段代码中,由于i是全局变量,存在变量提升,所以值会一直更迭到10

    由于function中储存的是变量i,而不是具体数值,所以一旦调用,就会寻找到变量i的地址,最后得出结果10

var a = [];
for (let i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); //输出6
  • 这段代码中,由于变量i是let声明的,所以当前的i只在本轮循环有效,即每一次循环的i其实都是一个新的独立的变量(这一点和Java中的很不一样)

    当function调用时,会寻找当时存储的那个独立的i的地址,所以最后输出的是6。

  • 更多可以得知的信息

    1. i在离开作用域后并不会被立即销毁,这点和java中的局部变量不一样
    2. JS引擎内部会记住上一轮循环的值,初始化本轮的i时,就会在上一轮的基础上计算。这样for循环就能正常迭代i的值
    3. for由两个作用域组成:一个父作用域(设置循环变量部分)和一个子作用域(循环体内部),两个作用域是不相冲突的,都可以设置同名let变量

标签:ES6,const,变量,作用域,报错,var,let
From: https://www.cnblogs.com/Solitary-Rhyme/p/16926003.html

相关文章

  • Servlet知识总结
    Servlet的相关知识:Servlet中的service方法:这个方法的作用是对客户端的请求做出相应的相应一个Servlet程序的编写过程:1、先写一个类,这个类实现Servlet,实现相应的方法......
  • <八>通过new和delete重载实现对象池的应用
    MyQueue版本1#include<iostream>usingnamespacestd;template<typenameT>classMyQueue{private: structQueueItem{ QueueItem(T_data=T(),QueueItem......
  • Quartz_简单编程式任务调度使用(SimpleTrigger)
    最近在工作中,要做定时任务的更能,最开始的时候,想到的是JavaSE中,自带Timer及TimerTask联合使用,完成定时任务。最后发现,随着业务的复杂,JDK中的Timer和TimerTask......
  • Waves Complete 11 for Mac(Waves全套混音插件包) v2020.11.12 完美激活版
    WavesCompleteformac是一款强大的音乐创作工具,含有各种混音插件,从运行速度到插件调用,性能和速度都大大提升,从混响,压缩,降噪和EQ到模拟硬件,环绕和后期制作工具,深受艺术家们......
  • cpp constexpr 类名推断(gcc需要7.3以上
    #include<iostream>#include<string_view>template<typenameT>structTypeName{constexprstaticstd::string_viewfullname_intern(){#ifdef......
  • servlet开发步骤及web欢迎页面
    servlet类开发步骤1.编写一个servlet类直接继承httpservlet2.重写httpservlet类中的doGet或doPost方法,具体重写谁,由后端决定3.将servlet配置到web.xml文件中4.配置......
  • C# 中的 const 和 readonly 有什么区别?
    问题constC#和C#之间有什么区别readonly?你什么时候会用一个而不是另一个?除了明显的区别必须在定义constVSreadonly值时声明值可以动态计算,但需要在构造函数退出之前分......
  • js面向对象+ES6
    1、面向对象编程介绍1、面向过程编程POP(Process-orientedprogramming)面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一......
  • 聊聊异步编程CompletionService的使用
    在日常需求的研发过程中都遇到过需要调用多个服务并将他们的结果进行合并的需求。这种情形又分为多个结果相互不依赖的情况,以及多个调用的结果相互依赖。比如一个首页,需要......
  • ES5 新增数组方法 ES6 新增数组方法
    ES5新增数组方法|对象调用的方法|作用|返回值||---------------------------------......