JavaScript—ES6新增之let、const

182 阅读2分钟

一、let、const

1. 为什么要有let、const

  • 作用域

    • 什么是作用域
      • 作用域是一套查询变量的规则,它确定了在哪里以及以何种方式来进行查询
      • 根据变量找对应的容器→LHS 非严格模式下会创建一个具有该名称的变量,严格状态下→ReferenceError
      • 根据容器找对应的变量→RHS RHS在作用域链中找不到所需要的变量→ReferenceError
        对RHS查询到的变量进行不合理的操作→TypeError
      • 实例
      function foo(a) {
      	// var a = 2;    LHS
      	console.log(a); // 2次RHS
      }
      foo(2); // RHS
      
    • es6之前
      • 全局作用域→全局变量 1.全局作用域下声明 2.函数内部不使用关键字声明的变量
      • 函数作用域→局部变量 1.函数中声明的变量 2.调用函数传递的参数
      • 变量调用规则 全局或函数作用域中都可使用,函数内部使用全局变量是沿作用域链向上查找最近的值,但是全局作用域下无法使用函数作用域中声明的局部变量,立即执行函数 and 闭包正是用来解决这一问题
    • es6新增
      • 块级作用域 由{}包含起来的代码区域,for循环
  • var声明变量的缺点

    • 全局情况下声明的变量在全局中生效,容易造成全局作用域污染,理想情况是变量在使用时创建,不使用时就销毁掉,显然var无法满足
    • var声明变量存在变量提升,

2. let、const、var对比

  • let VS const
    • let声明变量,const声明常量
    • const声明常量时必须赋初值
    • const声明常量时如果该常量为Object,声明的是指向这个Object的引用,里面的属性和值可以修改
  • let、const VS var
    • let、const 声明变量时会为其隐式创造块级作用域
    • let、const不可重复声明
    • let、const不存在变量提升,因此会存在暂时性死区(声明之前调用会引发引用错误)的问题

二、面试题

待总结