ES6语法(2)

let&const

  1. let&const 共同点:
    (1) 不允许重复声明变量
    (2) 没有变量提升(其实在执行上下文阶段被创建出来了,但是不能被访问,从而达到没有变量提升的效果)
    (3) 设置块级作用域(变量,方法只能在块级作用域内部访问,不能在外部访问)
    (4) 形成暂时性死区(在块级作用域中,即使外层区域声明过该变量,只要在块级作用域内用let/const声明同名变量,就无法提前访问,此时该块级作用域称为暂时性死区)

  2. let&const 不同点:
    (1) const一般用来声明一个常量,不允许修改,而let是可以多次修改变量值的
    (2) const声明变量必须有默认赋值,let可以没有默认赋值
    (3) 如果const声明的是一个引用类型,那么只要不是修改指针地址,而是修改引用类型内部的数据,是可以的,修改引用类型的指针地址是不允许的

let&const与window的关系

  1. 前提: 最新的ECMA标准中,没有VO(变量对象)的概念,取而代之的是VE(变量环境)
    每一个执行上下文会关联到变量环境(VE)中,在执行代码中变量和函数的声明会作为环境记录(ER)添加到变量环境中,对于函数来说,参数也会被作为环境记录添加到变量环境中
  2. 关系: let和const不会再window对象上添加任何属性,而var声明的变量会在window对象上同步添加,let 和const 的声明的变量保存到VariableMap中,通过HashMap的形式进行存储和查找

块级作用域补充

  1. 部分浏览器为了兼容以前的代码,在块级作用域内,用function直接声明的函数是不受块级作用域限制的,在外部仍然可以访问

      /* var和function声明的变量和方法都可以在块级作用域外访问 */
    {
      let a = 1
      var b = 2
      function add(){ console.log(a) }
    }
    console.log(a) --> 报错,提示找不到变量a
    add() --> 1
    console.log(b) --> 2
  2. if/switch/for
    这些都是块级作用域(不针对var和function声明的变量和方法)

用 let for循环 示意代码

  for( let i = 0 ; i<3 ; i++ ){
    console.log( i )
  }

相当于:
    {
        let i = 0;
        console.log( i ) --> 0
        i++
    }

    {
        let i = 1
        console.log( i ) --> 1
        i++
    }
    
    {
        let i = 2
        console.log( i ) --> 2
        i++
    }

注意: 这里不能使用const 进行for循环,因为有对原来值进行修改的操作(i++)


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!