let 与 var 的区别

let 是 es6.0 新增的定义变量的方式,用来声明局部变量,用法类似于 var 但也有区别

  • 定义块级作用域变量

    {
        var i=0;
    }
    console.log(i);//0
    

    {} 无法限定 var 定义的变量的访问范围

    {
        let i=0;
    }
    console.log(i); //Uncaught ReferenceError: i is not defined
    

    {} 能限定 let 定义的变量的访问范围

  • 解决闭包问题共用父级作用域的问题

    function test(){
        var arr = []
        for(var i=0;i<10;i++){	//执行到最后 i = 10
            arr[i] = function(){	//这里只是函数的定义,并不会取存 i 的值
                console.log(i);
            }
        }
        return arr;
    }
    var myArr = test();
    for(var j=0;j<10;j++){
        myArr[j]();		//10个10
    }
    

    被保存到外部的10个函数共用一个父级作用域

    function test(){
        var arr = []
        for(let i=0;i<10;i++){	
            arr[i] = function(){	
                console.log(i);
            }
        }
        return arr;
    }
    var myArr = test();
    for(var j=0;j<10;j++){
        myArr[j]();		//0-9
    }
    

    let定义的变量每次执行都是一个全新的作用域,被保存到外部的10个函数有10个不同的作用域

  • let 变量预编译不会提升

    console.log(i)
    var i=0     //undefined
    

    var 定义的变量预编译阶段会声明提升

    console.log(i)
    let i=0     //Uncaught ReferenceError: Cannot access 'i'
    

    let 定义的变量不会提升

  • let 变量不能重复声明

    var i=0;
    var i=1;
    

    var 重复声明并不会报错

    let i=0;
    let i=1;  //ncaught SyntaxError: Identifier 'i' has already been declared
    

    let 重复声明报错

原文地址:https://www.cnblogs.com/angle-yan/p/13339921.html