ECMAScript 6(一)
阿新 • • 發佈:2018-01-18
img ava 循環 寫法 foo 執行過程 true 如果 emp
- 塊級作用域綁定
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(一)