javascript做用域篇1、什麼是javascript做用域鏈

本文內容:javascript

  1. 什麼是做用域?執行環境、變量對象;
  2. 什麼是做用域鏈?
  3. 擴展:延長做用域鏈的兩條語句with與catch

做用域鏈是javascript中常見的一個概念,想要理解做用域鏈,首先要理解好下面的兩個概念:執行環境(常說的做用域)和變量對象。前端

做用域 == 執行環境
首先在其餘語言中所說的做用域,在javascript中也叫執行環境,一般把做用域叫做執行環境,在javascript高級程序設計這本書中也是稱爲「執行環境」。
***那麼到底什麼是執行環境呢?***java

執行環境
**執行環境**是javascript中的一個重要概念,**它定義了變量或者函數有權訪問的數據。執行環境有兩種類型:全局執行環境和局部執行環境,其中局部執行環境就是指函數。(也能夠說javascript做用域有兩種,全局做用域和局部做用域)**
全局執行環境是最外圍的一個執行環境,如在Web瀏覽器中,全局執行環境就是window對象,所以全部全局變量和函數都是做爲window對象的屬性和方法建立的。
另外還有一個與之相關的重要概念,就是**變量對象**。
變量對象
每個執行環境(每個做用域)都有一個與之關聯的**變量對象**,環境定義的全部變量和函數都保存在這個對象中(咱們是沒法訪問到這個對象的,它的做用是解析器處理數據時會在後臺使用它)。瀏覽器

做用域鏈
做用域鏈,顧名思義是一條鏈式結構,而這條鏈的每個節點應該是做用域。又由於做用域即執行環境,上面說到每一個執行環境都有一個與之關聯的變量對象,所以能夠說做用域鏈是這樣的一條鏈:函數


做用域鏈中的每個節點都是變量對象,變量對象上面保存着當前執行環境(做用域)中定義的變量和函數。做用域鏈的起點是當前執行的代碼所在的執行環境對應的變量對象,下一個節點的變量對象則是來自包含環境,即上一個節點所在的執行環境的外部環境,再下一個節點是下一個外部環境,這樣一層層延續直至到全局環境:全局環境的變量對象永遠是做用域鏈的終點。
*知道了做用域鏈是什麼,又有了另外一個疑問做用域鏈這個東西是用來幹什麼的呢?*
做用域鏈的提出是爲了在任何執行環境中訪問變量或函數提供一個次序規則。通俗的說,你想訪問一個變量,那麼這個變量去哪裏拿到呢,當前執行環境有,則取當前執行環境下的,這個無可厚非,當前環境沒有定義的,則按照這個做用域鏈一級一級的搜索做用域鏈,若最後直到在全局環境中都尚未找到,則會報錯,視爲該變量沒有定義。spa

var a = 1
function fn1 () {
    var b = 2
    fn2()
    console.log(a,b) // 1,2 此時只能訪問a,b, 訪問c會報錯
    function fn2() {
        var c = 3
        console.log(a,b,c) // 1, 2, 3,這裏a,b,c所有可以訪問
    }
}
fn1()
console.log(a) // 1 此時只能訪問a, 訪問b,c會報錯        

上面的代碼涉及了三個執行環境:全局環境、fn1()的局部環境和fn2()的局部環境。在全局執行環境中只有一個變量a和函數fn1(),在函數fn1()的局部環境中有一個變量b和函數fn2(),可是在此執行環境中除了b和fn2還能夠訪問變量a,由於全局環境是它的父執行環境。在fn2()的局部環境中,有一個變量c,除了變量c,這個執行環境中還能夠訪問全局環境中的變量a和它的直接父執行環境fn1()中的變量b。下面的圖能夠形象的展現這個做用域鏈。設計


內部環境能夠經過做用域鏈訪問全部的外部環境。但外部環境不能訪問內部環境中的任何變量和函數。每一個環境均可以向上搜索做用域鏈以查詢變量和函數名,但任何環境不能向下搜索做用域鏈。對象

擴展
有兩個語句,可使做用域鏈的前端增長一個變量對象:
catch和with;blog

相關文章
相關標籤/搜索