zoukankan      html  css  js  c++  java
  • ECMAScript 6 -- let和const命令

    ES6新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。

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

    可以执行

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

    就会报错

    ncaught ReferenceError: i is not defined
        at <anonymous>:3:13
        at Object.InjectedScript._evaluateOn (<anonymous>:145:167)
        at Object.InjectedScript._evaluateAndWrap (<anonymous>:137:25)
        at Object.InjectedScript.evaluate (<anonymous>:118:14)

    let var使用区别:

    var:

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

    结果:

    10

    变量ivar声明的,在全局范围内都有效,所以全局只有一个变量i。每一次循环,变量i的值都会发生改变,而循环内被赋给数组afunction在运行时,会通过闭包读到这同一个变量i,导致最后输出的是最后一轮的i的值,也就是10。

    let:

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

    结果:

    6

    变量ilet声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量,所以最后输出的是6。

    for循环还有一个特别之处,就是循环语句部分是一个父作用域,而循环体内部是一个单独的子作用域。

    不存在变量升级:

    // var 的情况
    console.log(foo); // 输出undefined
    var foo = 2;
    
    // let 的情况
    console.log(bar); // 报错ReferenceError
    let bar = 2;
    VM171:2 undefined

    报错:

    VM171:6 Uncaught ReferenceError: bar is not defined
        at <anonymous>:6:13
        at Object.InjectedScript._evaluateOn (<anonymous>:145:167)
        at Object.InjectedScript._evaluateAndWrap (<anonymous>:137:25)
        at Object.InjectedScript.evaluate (<anonymous>:118:14)(anonymous function) @ VM171:6InjectedScript._evaluateOn @ VM68:145InjectedScript._evaluateAndWrap @ VM68:137InjectedScript.evaluate @ VM68:118
  • 相关阅读:
    集合总结
    dagger2系列之Scope
    dagger2系列之依赖方式dependencies、包含方式(从属方式)SubComponent
    dagger2系列之生成类实例
    Dagger2系列之使用方法
    Handler系列之内存泄漏
    Handler系列之创建子线程Handler
    Handler系列之原理分析
    Handler系列之使用
    HTML标签
  • 原文地址:https://www.cnblogs.com/androidsuperman/p/6879573.html
Copyright © 2011-2022 走看看