【ES6】 let和const命令

216 阅读1分钟

var、let和const的区别

  • 变量提升

    let和const定义的变量不存在变量提升,在定义之前使用,会报错ReferenceError

  • 暂时性死区

    let和const只在块级作用域中有效,称为“暂时性死区”(temporal dead zone,简称 TDZ)。

    if (true) {
      // TDZ开始
      tmp = 'abc'; // ReferenceError
      console.log(tmp); // ReferenceError
    
      let tmp; // TDZ结束
      console.log(tmp); // undefined
    
      tmp = 123;
      console.log(tmp); // 123
    }
    
  • 循环中i的定义

    var result = new Array();
    
    for (var i=0; i<10; i++) {
      result[i] = function() {
        return i;
      }
    }
    console.log(result[0]())       // 打印10
    

    之所以结果返回10,这是因为所有的i都使用同一个引用,而i最终会被更新为10,因此,result中所有函数都会返回10。

    使用let解决变量污染:

    var result = new Array();
    
    for (let i=0; i<10; i++) {
      result[i] = function() {
        return i
      }
    }
    console.log(result[0]())	// 打印0
    

    在每次循环当中,都会创建一个新的let i(因为let只在块级作用域有效,因此是不会报错的),因此result[i]使用的每个i都是不同的,值并不会像使用var的例子那样不断增加。

  • 其他

    1、let和const不允许重复声明

    2、let和const不会绑定全局作用域

let和const的区别

const是常量,不能被更改。