1. 程式人生 > >ECMAScript 6(一)

ECMAScript 6(一)

img ava 循環 寫法 foo 執行過程 true 如果 emp

  1. 塊級作用域綁定

    ES5只有全局作用域和函數作用域,沒有塊級作用域。

    技術分享圖片

    此處輸出undefined,是因為變量提升,內層的temp替換覆蓋了外層的temp變量。

    變量提升:var 命令會發生“變量提升”現象,即變量可以在聲明之前使用,即undefined,為了糾正這種現象,let命令改變了語法行為,它所聲明的變量一定要在聲明之後使用。

    技術分享圖片

    i作為一個計數變量,在執行過程中,變成了全局變量。在循環結束之後,i並沒有消失,泄露成了全局變量。

    為此,ES6中的let為JavaScript新增了塊級作用域。

    技術分享圖片

    foo1方法中,有2個代碼塊,在這2個代碼塊中都聲明了變量n,運行後輸出5。這表示外部代碼塊不受內部代碼塊的影響。而,如果兩次都使用var定義變量n,最後輸出的才是10。

技術分享圖片

    塊級作用域的寫法:

1 {
2    let tmp=...;
3    ...
4 }

    塊級作用域與函數聲明:

1     if(true){
2         function foo3(){}
3     }
4 
5     try{
6         function foo4(){}
7     }catch(e){
8 
9     }

    ES6引入了塊級作用域,明確允許在塊級作用域之中聲明函數。塊級作用域之中,函數聲明語句的行為類似於let,在塊級作用域之外不能使用。

    技術分享圖片

    在if內聲明的函數foo7()會被提升到函數頭部,實際的代碼如下:

    技術分享圖片

    綜上所述:

    1.let聲明的變量只在所處於的塊級有效;

    2.let沒有‘變量提升’的特性,而是‘暫時性死區’特性;

ECMAScript 6(一)