ECMA-1 let const

127 阅读1分钟

Let:

  1. 快级作用域
  2. 不可重复声明同一个变量
  3. 不可变量提升、暂时性死区
  4. 值可被修改

1、块级作用域

块级作用域写在 {} 中,如果没有 {},js会以为没有块级作用域

for 循环中有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域

for(let i=0; i<3; i++){
    let i = 'abc';
    console.log(i)
}
// 输出三次 abc 

函数的块级作用域

// 浏览器的 ES6 环境
function f() { console.log('I am outside!'); }

(function () {
  if (false) {
    // 重复声明一次函数f
    function f() { console.log('I am inside!'); }
  }

  f();
}());
// Uncaught TypeError: f is not a function

报错的原因是,内部的f()被当做var 变量,被提升声明,等同于以下代码
function f() { console.log('I am outside!'); }

(function () {
  var f = undefined
  if (false) {
    // 重复声明一次函数f
    function f() { console.log('I am inside!'); }
  }

  f();
}());

Const:

  1. 快级作用域
  2. 声明的时候就得赋值
  3. 值不可修改
  4. 不可重复声明
  5. 暂时性死区

值不可修改

const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。
1、对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。
2、但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。