作用域鏈本質上就是使用的是哪個變數,全域性變數,區域性變數,自身的變數。這個在看別人程式碼的邏輯的時候非常有用,底層是變數的查詢機制。
- 巢狀關係的作用域竄連起來形成了作用域鏈
- 在函式被執行,會優先查詢當前函式作用域中的變數。
- 如果當前函式作用域找不到,則會逐級查詢父級作用域,知道全域性作用域
- 相同作用域鏈中按著從小到大的規則查詢變數
- 子作用域能夠訪問父作用域,父作用域無法訪問子作用域
程式碼一:
// 作用域鏈
let a = 6;//全域性作用域
function f() {
function d(){
console.log(a);
}
d();
}
f();
上述程式碼輸入的是6 ,函式d()最後找到了全域性作用域
程式碼二:
let a = 6;//全域性作用域
function f() {
a = 7;//父級作用域
function d(){
console.log(a);
}
d();
}
f();
上述程式碼輸入的是7,函式d()找到了父級作用域
程式碼三:
// 作用域鏈
let a = 6;//全域性作用域
function f() {
a = 7;//父級作用域
function d(){
a = 8;//自己的作用域
console.log(a);
}
d();
}
f();
上述程式碼輸出的是8,最後找到函式自身的變數,函式自身的作用域優先順序最高