執行環境
- 全局執行環境是最外圍的一個執行環境。
- 每個函數都有自己的執行環境。
作用域鏈
當代碼在一個環境中執行時,會創建變量對象(variable object)的一個作用域鏈。作用域鏈的用途是保證對執行環境有權訪問的所有變量和函數的有序訪問。作用域鏈的前端,始終都是當前執行的代碼所在環境的變量對象。
舉例
var a = 1
function fn1(){
function fn2(){
console.log(a)// 這里可以訪問到自己的變量對象、fn1()變量對象、全局變量對象
}
function fn3(){
var a = 4
fn2() // 這里可以訪問到自己的變量對象、fn1()變量對象、全局變量對象
}
var a = 2
return fn3 // 這里可以訪問到自己的變量對象、全局變量對象,但這里不能訪問fn2()、fn3()變量對象
}
var fn = fn1()
fn() //2
- 以上代碼有4個執行環境:
- 全局執行環境(包括變量a=1、函數fn1)
- fn1()的局部環境 (包括變量a=2、函數fn2、函數fn3)
- fn2()的局部環境
-
fn3()的局部環境(變量a=4)
執行環境.jpg
上圖表示是特定的執行環境。其中,內部環境可以通過作用域鏈去訪問到所有外部環境,但外部環境不能訪問內部環境的任何變量和函數。每個環境都可以向上搜索作用域鏈,以查詢變量和函數,但不能向下搜索作用域鏈。例如fn2在所在區域搜索不到,只能向上搜索變量。即fn2()
的作用域鏈中包含3個對象:自己的變量對象、fn1()變量對象、全局變量對象
- 執行代碼的思路:
調用fn()———》執行fn1()———》renturn fn3()————》執行fn3——》執行fn2——》console.log(a)所在區域沒有a,向父級作用域找a——》輸出2;