JavaScript執行環境及做用域(三)——沒有塊級做用域

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對象的屬性存在的,以下圖:前端

因此根據做用域鏈機制會正常打印redjava

沒有塊級做用域是個缺點,好在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塊內部訪問到aacode

因此若是用的是ES5,那是無法使用塊級做用域的。ES6出來有幾年了,瀏覽一下各主流明星互聯網公司的招聘需求,基本都要求熟悉ES6標準,建議讀者們都學習一下。對象

相關文章
相關標籤/搜索