作用域是什麼?
作用域就是變數與函式的可訪問範圍
作用域鏈又是什麼呢?
講作用域鏈之前,我們首先要講一下變數是怎麼查詢的。
var name = 'window.name';
function foo(){
var name = 'foo.name';
console.log(name);
}
function bar(){
console.log(name);
}
foo(); // foo.name
bar(); // window.name複製程式碼
變數查詢的時候,會先從當前執行上下文中查詢該變數,如果未找到,就會去父級執行上下文中查詢,直到全域性執行上下文(如果對於執行上下文不理解,可以看我之前的一篇文章《執行上下文和執行棧》),而變數這種查詢的規則就形成了作用域鏈。
但是需要注意的是,我之前的文章講過
執行上下文的建立階段:確定this及作用域鏈,宣告函式並初始化,宣告變數並賦予預設值undefined,建立arguments物件
接下來看一個例子:
let name = 'window.name';
function foo(){
console.log(name);
}
function bar(){
let name = 'bar.name';
foo();
}
bar(); // window.name
複製程式碼
所以寫程式碼的時候不要被自己繞暈了
如果有錯誤或者不嚴謹的地方,請給予指正,十分感謝!