ES6-let

作者: 东邪_黄药师 | 来源:发表于2018-10-31 10:57 被阅读1次

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

    {
        var a = 100;
        let b = 200;
    }
    console.log(a); //100
    console.log(b); //b is not defined -- Error
    

    不存在变量提升
    let不像var那样,会发生“变量提升”现象。

      //ES5
    console.log("ES5:");
    var a = [];
    for (var i = 0; i < 10; i++) {
        var c = i;
        a[i] = function () {
            console.log(c);
        };
    };
    a[5](); //9
    
    //ES6
    console.log("ES6:");
    var b = [];
    for (var j = 0; j < 10; j++) {
        let d = j;
        b[j] = function () {
            console.log(d);
        };
    };
    b[5](); //5
    

    暂时性死区

      {
        console.log(a); //undefined
        let a = 100;
        console.log(a); //100
    }
    

    只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。

    var a = 100;
    {
        console.log(a); //undefined
        let a = 100;
        console.log(a); //100
    }
    

    不允许重复声明
    let不允许在相同作用域内,重复声明同一个变量

     // 模块之间不影响,可以重复声明
    {
        var a = 100;
        var a = 200;
        console.log(a);  //200
    }
    {
        let a = 300;
        console.log(a); //300
    }
    // 模块内部不允许用let命令重复声明
    {
        var a = 1;
        let a = 2;   //输出后会报错
    }
    

    ===========================================================
    为什么需要块级作用域?
    ES5只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景。
    第一种场景,内层变量可能会覆盖外层变量。

    var time = new Date();
    
    function fun() {
        console.log(time);
        if (false) {
            var time = "Hello World!";
        };
    };
      //time="hello world" 把外部的new Date 覆盖了
    fun();  //undefined
    

    第二种场景,用来计数的循环变量泄露为全局变量。

    var string = "Hello World!";
    
    for (var i = 0; i < string.length; i++) {
        console.log(string[i]);
    };
    
    console.log("循环结束");
    
         //i跳出的循环体,没有被完全释放出来。
    console.log(i); //12
    

    =========================================================

     <script type="text/javascript">
    console.log("ES5:");
    
    function fun() {
        var num = 100;
        if (true) {
            var num = 200;
        };
        console.log(num);
    };
    
         fun(); //200
      </script>
    
      <script type="text/traceur">
    console.log("ES6:");
    
    function fun() {
        let num = 100;
        if (true) {
            let num = 200;
        };
        console.log(num);   //num没有受到let num =200的影响
    };
    
    fun();  //100
    

    </script>

    案例二:

       <script type="text/traceur">
    console.log("ES6:");
    function fun() {
        console.log("I am outside!");
    };
    
    (function () {
        if (false) {
            function fun() {
                console.log("I am inside!");
            };
        };
    
        fun();
    }());  //I am outside!
      </script>
    

    ===========================================================

    相关文章

      网友评论

          本文标题:ES6-let

          本文链接:https://www.haomeiwen.com/subject/hagntqtx.html