作用域與作用域鏈
-
理解
- 就是一塊“地盤”,一個碼段所在的區域
- 它是靜態的(相對於上下文對象),在編寫代碼時就確定了
-
分類
- 全局作用域
- 函數作用域
- 沒有塊作用域(ES6有了)
-
作用
-
隔離變量,不同作用域下同名變量不會有衝突
//沒塊作用域 if (true) { var c = 3 } console.log(c) var a = 10, b=2 function fn(x) { var a = 100, c = 300; console.log('fn()',a,b,c,x) function bar(x) { var a = 1000, d=400 console.log('bar',a,b,c,d,x) } bar(100) bar(200) } fn(10)
-
作用域與執行上下文
區別1
- 全局作用域之外,每個函數都會創建自己的作用域,作用域在函數定義時就已經確定了。而不是在函數調用時
- 全局執行上下文環境是在全局作用域確定之後,js代碼馬上執行之前創建
- 函數執行上下文是在函數調用時,函數體代碼執行之前創建
區別二
- 作用域是靜態的,只要函數定義好了就一直存在,且不會再變化
- 執行上下文是動態的,調用函數時創建,函數調用結束時就會自動釋放
聯繫
- 上下文環境(對象)是從屬於所在的作用域
- 全局上下文環境==>全局作用域
- 函數上下文環境==>對應的函數作用域
作用域鏈
-
理解
- 多個上下級關係的作用域形成的鏈,它的方向時從下向上的(從內到外)
- 查找變量時就是沿着作用域鏈來查找的
-
查找一個變量的查找規則
- 在當前作用域下的執行上下文中查找對應的屬性,如果有直接返回,否則進入2
- 在上一級作用域的執行上下文中查找對應的屬性,如果有直接返回,否則進入3
- 再次執行2的相同操作,知道全局作用域,如果還找不到就拋出找不到的異常
var a = 1
function fn1(){
var b = 2
function fn2(){
var c = 3
console.log(c)
console.log(b)
console.log(a)
console.log(d)
}
fn2()
}
fn1()