前端笔记——ES6(1)

let

  • 不存在变量提升,先声明后使用
  • 暂时性死区,在当前作用域声明的变量,在变量声明语句之前不可用,typeof 操作也不再百分百安全
  • 不允许重复声明

    经典题目

    var a = [];
    for (var i = 0; i < 10; i++) {
      a[i] = function () {
          console.log(i);
      };
    }
    a[6](); // 10
    

    为什么要块级作用域

  • 内层变量可能会覆盖外层变量
    var tmp = new Date();
    function f() {
      console.log(tmp);
      if (false) {
          var tmp = "hello world";
      }
    }
    f(); // undefined
    
  • 循环变量泄露
    var s = 'hello';
    for (var i = 0; i < s.length; i++) {
      console.log(s[i]);
    } 
    console.log(i); // 5
    

    const

  • 与前面let的几点相同
  • 一旦声明,值就不能改变
  • 声明时必须初始化
  • 对于引用对象,只是引用的地址不能改变,而不是内容不变