1. 程式人生 > 實用技巧 >let 與 var 的區別

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 重複宣告報錯