官术网_书友最值得收藏!

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引用都會在當前樓層進行查找,如果沒有找到,就會坐電梯前往上一層樓,如果還是沒有找到就繼續向上,以此類推。一旦抵達頂層(全局作用域),可能找到了你所需的變量,也可能沒找到,但無論如何查找過程都將停止。

主站蜘蛛池模板: 怀化市| 务川| 定安县| 囊谦县| 崇信县| 额敏县| 湖南省| 八宿县| 西和县| 大兴区| 安塞县| 屏东县| 芮城县| 瓮安县| 奇台县| 福贡县| 栾城县| 临沭县| 泰宁县| 杭锦后旗| 丰镇市| 凤凰县| 阿拉尔市| 罗田县| 离岛区| 宁津县| 北流市| 都昌县| 汶上县| 罗山县| 汉源县| 嘉峪关市| 新竹县| 四平市| 迭部县| 巩留县| 鸡东县| 平利县| 孝昌县| 漳州市| 武威市|