- 你不知道的JavaScript(上卷)
- (美)凱爾辛普森
- 638字
- 2019-06-06 10:48:11
1.3 作用域嵌套
我們說過,作用域是根據名稱查找變量的一套規則。實際情況中,通常需要同時顧及幾個作用域。
當一個塊或函數嵌套在另一個塊或函數中時,就發生了作用域的嵌套。因此,在當前作用域中無法找到某個變量時,引擎就會在外層嵌套的作用域中繼續查找,直到找到該變量,或抵達最外層的作用域(也就是全局作用域)為止。
考慮以下代碼:
function foo(a) { console.log(a + b); } var b = 2; foo(2); // 4
對b進行的RHS引用無法在函數foo內部完成,但可以在上一級作用域(在這個例子中就是全局作用域)中完成。
因此,回顧一下引擎和作用域之間的對話,會進一步聽到:
引擎:foo的作用域兄弟,你見過b嗎?我需要對它進行RHS引用。
作用域:聽都沒聽過,走開。
引擎:foo的上級作用域兄弟,咦?有眼不識泰山,原來你是全局作用域大哥,太好了。你見過b嗎?我需要對它進行RHS引用。
作用域:當然了,給你吧。
遍歷嵌套作用域鏈的規則很簡單:引擎從當前的執行作用域開始查找變量,如果找不到,就向上一級繼續查找。當抵達最外層的全局作用域時,無論找到還是沒找到,查找過程都會停止。
把作用域鏈比喻成一個建筑
為了將作用域處理的過程可視化,我希望你在腦中想象下面這個高大的建筑:

這個建筑代表程序中的嵌套作用域鏈。第一層樓代表當前的執行作用域,也就是你所處的位置。建筑的頂層代表全局作用域。
LHS和RHS引用都會在當前樓層進行查找,如果沒有找到,就會坐電梯前往上一層樓,如果還是沒有找到就繼續向上,以此類推。一旦抵達頂層(全局作用域),可能找到了你所需的變量,也可能沒找到,但無論如何查找過程都將停止。
推薦閱讀
- The Modern C++ Challenge
- 深入理解Java7:核心技術與最佳實踐
- Oracle從入門到精通(第5版)
- 深入理解Elasticsearch(原書第3版)
- CoffeeScript Application Development Cookbook
- UI設計全書(全彩)
- RocketMQ實戰與原理解析
- Mastering ASP.NET Core 2.0
- JavaScript程序設計基礎教程(慕課版)
- JavaScript程序設計實例教程(第2版)
- 基于Docker的Redis入門與實戰
- C++ Windows Programming
- 計算機視覺實戰:基于TensorFlow 2
- Advanced C++
- Python GUI設計:tkinter菜鳥編程