當代碼在一個環境中執行的時候會建立變量對象的一個做用域鏈(scope chain),做用域鏈的做用是保證執行環境有權訪問相應的變量,做用域鏈的前端始終都是當前執行的代碼所在環境的變量對象,最後端的始終都是全局環境的變量對象(global)
這麼講有點抽象,不過咱們簡單的畫個圖片應該就好理解前端
並且咱們這個做用域鏈只能從「內」到「外」,不能反向取變量,咱們接下來用代碼舉個栗子
我這裏在全局環境裏面定義了兩個變量
在全局環境裏面定義了一個函數,函數裏面有兩個小變量,分別讓這兩個小變量獲取到全局變量(外層),而且把它們兩個返回出來
咱們在局部環境依然取到了全局的變量
可是咱們在全局環境嘗試直接取內部的變量是取不到的會報錯! 做用域鏈的解析是一級一級往上搜索的過程,若是最終在全局裏面找不到對應的變量,通常會報錯(在新的Es7語法中軟化了這種問題)