JavaScript中沒有塊級做用域常常會致使理解上的困惑,在其餘類C的語言中,由花括號封閉的代碼都有本身的做用域,於是支持根據條件來定義變量。可是在JavaScript中下面的代碼並不會獲得想象中的結果:javascript
if(true){ var aa = 'red'; } console.log(aa);//red
這裏在if
語句中定義了一個變量aa
,若是是在C、C++或Java中,aa
會在if
語句執行完畢後被銷燬。但在JavaScript中,if
語句裏的變量聲明會將變量添加到當前的執行環境,而JavaScript中的執行環境一般只有兩種——全局執行環境和局部執行環境,局部執行環境通常就是函數,因此這裏的aa
是定義在全局執行環境中,也就是做爲window對象的屬性存在的,以下圖:前端
因此根據做用域鏈機制會正常打印red
。java
沒有塊級做用域是個缺點,好在ES6把這個問題解決了,新標準中引入了關鍵字let
,支持了塊級做用域,看下面代碼:函數
if(true){ let aa = 'red'; console.log(aa);//red } console.log(aa);//Uncaught ReferenceError: aa is not defined
改用let
聲明變量aa
,在if
塊裏面能夠訪問aa
,外面就報錯了。學習
由下圖也能夠看出,aa
並無被聲明在window
上,而是在全局做用域Global
的前端增長了一個Block
做用域,而Block
正是塊的意思,根據做用域鏈機制能夠在if
塊內部訪問到aa
。code
因此若是用的是ES5,那是無法使用塊級做用域的。ES6出來有幾年了,瀏覽一下各主流明星互聯網公司的招聘需求,基本都要求熟悉ES6標準,建議讀者們都學習一下。對象