<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>let用途</title>
<script src="../../../vendor/traceur.js"></script>
<script src="../../../vendor/bootstrap.js"></script>
<script type="text/traceur">

/*ES6新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。
 
let不像var那样,会发生“变量提升”现象。

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

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

    var a = 100;
    let b = 200;
    console.log(a);    //100
    console.log(b);    //200
    
    
    {
        var a = 100;
        let b = 200;//大括号作用范围,不是函数作用域,
    }
    console.log(a);    //100
    console.log(b);    //b is not defined -- Error
    
-------------------------------------------------------------------    
    
    {
        var a = 100;
        let b = 200;//大括号作用范围,不是函数作用域,
        
        var d = b;
        var e = a;//语句已经执行了,进行了值传递,后面变量销毁和重新赋值不影响
    }
    a = 300;
    console.log(a);    //300
    console.log(d);    //200
    console.log(e);    //100
    //console.log(b);    //b is not defined -- Error
    
    
    for (let j = 0; j < 3; j++) 
    {
        console.log(j);//0,1,2
    };
    
    public static void main (String[] args) throws java.lang.Exception
    {
        int a = 3;
        {
           int b = a;
           a = 5;
           System.out.println(b);//3
        }
        
        
    }
    
    var a = 1;
    var a = 2;
    console.log(a);//2   
</script>
</head>
<body>

</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>let不存在变量提升</title>
<script src="../../../vendor/traceur.js"></script>
<script src="../../../vendor/bootstrap.js"></script>
<script type="text/traceur">
    //ES5
    console.log("ES5:");
    var a = [];
    for (var i = 0; i < 10; i++) 
    {
        var c = i;
        a[i] = function () {
            console.log(c);//基本变量是值传递,只有这行语句执行的时候,才会使用到c的值,此时c已经变成了9
        };
        console.log(a[i]);
    };
    
    a[5]();    //9

    //ES6
    console.log("ES6:");
    var b = [];
    for (var j = 0; j < 10; j++) 
    {
        let d = j;//每次都声明一个新的变量d,var不是,每次都是用之前声明的变量c,语句执行之前不会进行预加载,
        b[j] = function () {
            console.log(d);//这行语句执行的时候,使用的是d的值,而每一个d都是一个新的d值不一样
        };
    };
    b[5]();    //5
</script>
</head>
<body>

</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>let暂时性死区</title>
<script src="../../../vendor/traceur.js"></script>
<script src="../../../vendor/bootstrap.js"></script>
<script type="text/traceur">
    {
        console.log(a);    //undefined 语句执行之前不会进行预加载,
        let a = 100;
    }
    {
        let a = 100;
        console.log(a);    //100
    }
-------------------------------------------------------
    var a = 200;
    {
        
        console.log(a);    //undefined,不能用外部的a了,大括号里面都是let的a,
        let a = 100; //从声明的地方开始才能使用变量a
        console.log(a);    //100,不受外部影响。
    }
    
    
    {
        var a = 100;
        var a = 200;
        console.log(a);
    }
    // 报错
    {
        var b = 100;
        let b = 200;
        console.log(b);
    }
    // 报错
    {
        let c = 100;
        var c = 200;
        console.log(c);
    }
    // 报错
    {
        let d = 100;
        let d = 200;
        console.log(d);
    }
    
    
        // 模块之间不影响,可以重复声明
    {
        var a = 100;
        var a = 200;
        console.log(a);
    }
    {
        let a = 300;
        console.log(a);
    }
    // 模块内部不允许用let命令重复声明
    {
        var a = 1;
        let a = 2;
    }
</script>
</head>
<body>

</body>
</html>

 let只在大括号内有效,并且优先级高于var。