作用域及作用域鏈

王振宇發表於2019-03-25

作用域是什麼?

作用域就是變數與函式的可訪問範圍

作用域鏈又是什麼呢?

講作用域鏈之前,我們首先要講一下變數是怎麼查詢的。

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
複製程式碼

所以寫程式碼的時候不要被自己繞暈了

如果有錯誤或者不嚴謹的地方,請給予指正,十分感謝!

相關文章