本文內容: 一、什麼是做用域?執行環境、變量對象; 二、什麼是做用域鏈? 三、擴展:延長做用域鏈的兩條語句with與catchjavascript
做用域鏈是javascript中常見的一個概念,想要理解做用域鏈,首先要理解好下面的兩個概念:執行環境(常說的做用域)和變量對象。前端
首先在其餘語言中所說的做用域,在javascript中也叫執行環境,一般把做用域叫做執行環境,在javascript高級程序設計這本書中也是稱爲「執行環境」。 那麼到底什麼是執行環境呢?java
執行環境是javascript中的一個重要概念,它定義了變量或者函數有權訪問的數據。執行環境有兩種類型:全局執行環境和局部執行環境,其中局部執行環境就是指函數。(也能夠說javascript做用域有兩種,全局做用域和局部做用域) 全局執行環境是最外圍的一個執行環境,如在Web瀏覽器中,全局執行環境就是window對象,所以全部全局變量和函數都是做爲window對象的屬性和方法建立的。 另外還有一個與之相關的重要概念,就是變量對象。瀏覽器
每個執行環境(每個做用域)都有一個與之關聯的變量對象,環境定義的全部變量和函數都保存在這個對象中(咱們是沒法訪問到這個對象的,它的做用是解析器處理數據時會在後臺使用它)。函數
做用域鏈,顧名思義是一條鏈式結構,而這條鏈的每個節點應該是做用域。又由於做用域即執行環境,上面說到每一個執行環境都有一個與之關聯的變量對象,所以能夠說做用域鏈是這樣的一條鏈: ui
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。下面的圖能夠形象的展現這個做用域鏈。spa
有兩個語句,能夠使做用域鏈的前端增長一個變量對象: catch和with;設計