ES6之变量let、const的特点总结,添加实际例子。

let和const

let和const都是块级作用域,共同的特性如下:

  • 只在代码块内有效。

    if (false) {
        let a = 1;
    }
    console.log(a); //Uncaught ReferenceError: a is not defined
    
  • 不存在变量提升。

    if (false) {
        let a = 1;
    }
    console.log(a); //Uncaught ReferenceError: a is not defined
    
  • 不允许重复声明

    var a = 1;
    let a = 2; // Uncaught SyntaxError: Identifier 'a' has already been declared
    
  • 暂时性死区,只能在声明后使用。

    console.log(typeof value); // Uncaught ReferenceError: a is not defined
    let a = 1;
    
    var b = "global";
    
    // 匿名函数
    (function() {
        console.log(b); //Uncaught ReferenceError: b is not defined
    
        let b = 'local';
    }());
    
    // 块级作用域
    {
        console.log(b); //Uncaught ReferenceError: b is not defined
    
        const b = 'local';
    };
    

const特性

  • const声明是一个只读常量。一旦声明,常量的值就不能改变。

    const a = '1';
    a = '2' ;//Uncaught TypeError: Identifier 'a' has already been declared
    
  • const一旦声明,必须立即初始化,不能以后赋值。

    const a ;//Uncaught SyntaxError: Missing initializer in const declaration
    

实际应用

在循环中的块级作用域问题,最常见的一个问题如下:

for循环

  • var 定义i

      var funcs1 = [];
      for (var i = 0; i < 3; i++) {
          funcs1[i] = function () {
              console.log(i);
          };
      }
      funcs1[0]();//3
    
  • 解决this作用的普通方法

    var funcs2 = [];
    for (var j = 0; j < 3; j++) {
        funcs2[j] = (function (j) {
            return function(){
                console.log(j);
            }
        }(j));
    }
    funcs2[0]();//0
    
  • 通过let来解决该问题,每次迭代循环时都创建一个新变量,并以之前迭代中同名变量的值将其初始化

    var funcs3 = [];
    for (let i = 0; i < 3; i++) {
        funcs3[i] = function () {
            console.log(i);
        };
    }
    funcs3[0]();//0
    
  • 如果用const就会报错:Uncaught TypeError: Assignment to constant variable。因为虽然我们每次都创建了一个新的变量,然而我们却在迭代中尝试修改 const 的值,所以最终会报错。

for in循环

  • var可以运用在for in循环中

    var funcs = [], object = {a: 1, b: 1, c: 1};
    for (var key in object) {
        funcs.push(function(){
            console.log(key)
        });
    }
    funcs[0]() //c
    
  • let

    var funcs = [], object = {a: 1, b: 1, c: 1};
    for (let key in object) {
        funcs.push(function(){
            console.log(key)
        });
    }
    funcs[0]() //a
    
  • const:因为在 for in 循环中,每次迭代不会修改已有的绑定,而是会创建一个新的绑定。

    var funcs = [], object = {a: 1, b: 1, c: 1};
    for (const key in object) {
        funcs.push(function(){
            console.log(key)
        });
    }
    funcs[0]() //a
    
以上文章来自:黄卉 , https://huanghui8030.github.io/js/es601.html