我們都知道在javascript里是沒有塊級作用域的,而ES6添加了塊級作用域,塊級作用域能帶來什麼好處呢?為什麼會添加這個功能呢?那就得瞭解ES5沒有塊級作用域時出現了哪些問題。 ES5在沒有塊級作用域的情況下出現的問題: 一。在if或者for迴圈中聲明的變數會泄露成全局變數 二。內層變數可能會覆 ...
我們都知道在javascript里是沒有塊級作用域的,而ES6添加了塊級作用域,塊級作用域能帶來什麼好處呢?為什麼會添加這個功能呢?那就得瞭解ES5沒有塊級作用域時出現了哪些問題。
ES5在沒有塊級作用域的情況下出現的問題:
一。在if或者for迴圈中聲明的變數會泄露成全局變數
for(var i=0;i<=5;i++){ console.log("hello"); } console.log(i); //5
二。內層變數可能會覆蓋外層變數
var temp = new Date(); function f(){ console.log(temp); if(false){ var temp = "hello"; } } f(); //undefined
不管最後是否執行if語句,都會輸出undefined,因為temp會提升到函數頂部,因此覆蓋了外部的變數temp。
上一篇介紹的let和const命令,它們所聲明的變數只在所在的代碼塊內有效,即為js添加了塊級作用域。
【1】允許塊級作用域任意嵌套;
{{{let tmp = "hello world"}}}
【2】外層作用域無法讀取內層作用域的變數;
{{{ {let tmp = "hello world";} console.log(tmp); //error }}}
【3】內層作用域可以定義外層作用域的同名變數
{{{ let tmp = "hello world"; {let tmp = "hello world";} }}}
【4】函數本身的作用域在其所在的塊級作用域之內。
function f(){ console.log("outside"); } (function(){ if(false){ function f(){ console.log("inside"); } } f(); }());
這段代碼如果是在ES5中運行,那麼會輸出inside,因為在ES5中,函數會提升到作用域的頂部,如果是在ES6中運行,則會輸出outside,因為在ES6中函數無法提升,所以訪問到的f()是外層的f()。
【5】在ES5中,因為沒有塊級作用域,獲得廣泛運用的是立即執行函數。現在ES6增加了塊級作用域,那麼立即執行函數就不再必要了。
//立即執行函數 (function(){ var temp = "hello world"; }()); //塊級作用域 { var temp = "hello world"; }
【6】在嚴格模式下,函數只能在頂級作用域和函數內聲明,在if代碼塊和迴圈代碼塊下的聲明都會報錯。