關於let

ES6新增了聲明變量的命令let,let與var不一樣的是let聲明的做用域是塊級做用域。下面是let的幾種使用場景。瀏覽器

一、let常見使用場景閉包

以往寫for循環常常有這樣的代碼:for(var i=0;i<num;i++)ide

這種狀況下聲明的變量i的做用域其實函數做用域,至關於函數

var i;

for(i=0;i<num;i++)

 

如今有了let能夠這樣寫for(let i=0;i<num;i++),i只在for循環體內有效。須要注意的是在每次循環中i都是一個新的變量。可是JavaScript引擎會記錄上一個i的值,根據上一個i的值對本次的i進行初始化。由於let的這個特性因此能夠拿來解決閉包所帶來的問題。由於每一個i都是一個新的變量,因此輸出的i就是0,1,2,3,4...spa

var buttons=document.getElementsByTagName("button"); 
for(let i=0;i<buttons.length;i++){
  buttons[i].onclick=function(){
    console.log(i);
  }
}

for循環的變量i的做用域是父做用域,for循環裏面的句子還能夠用let再次定義icode

for(let i=0;i<10;i++){
    let i="aaa";
    console.log(i);//輸出aaa
}

二、var與let的不一樣blog

1.let塊級做用域ip

2.不支持變量提高作用域

3.會出現暫時性死區get

當用let聲明變量在該區域會產生封閉,外部的變量對其無影響

function test(){
        let i=1;
        let a=2;
        if(1){
            console.log(a);//不會出現暫時性死區,由於在該區域沒有再定義a因此會拿到上一級的變量a
            console.log(i);//出現暫時性死區,在該區域聲明瞭變量i,會產生封閉,外界的變量i則對其無影響,又由於let不提高變量因此出現報錯。
            let i;
        }
    }
    test()

 

4.不容許重複定義變量

var a;
let a;
//報錯

let a=1;
let a=2;
//報錯

 

5.不支持函數提高(但在支持ES6環境下仍是會支持提高,至關於var。通常不在塊做用域定義函數,即便定義函數也應使用let定義函數表達式,但在沒有大括號狀況下會報錯)

// 瀏覽器的 ES6 環境
function f() { console.log('I am outside!'); }

(function () {
  if (false) {
    // 重複聲明一次函數f
    function f() { console.log('I am inside!'); }
  }

  f();
}());
// Uncaught TypeError: f is not a function

//實際上執行的代碼效果 // 瀏覽器的 ES6 環境 function f() { console.log('I am outside!'); } (function () { var f = undefined; if (false) { function f() { console.log('I am inside!'); } } f(); }()); // Uncaught TypeError: f is not a function
相關文章
相關標籤/搜索