關(guān)于JavaScript中變量的作用域,全局變量在程序中始終都有定義。局部變量在聲明它的函數(shù)體內(nèi)以及其內(nèi)部所嵌套的函數(shù)內(nèi)始終是有定義的。那么JavaScript是如何管理這些全局變量和局部變量作用域的呢,這就涉及到了作用域鏈。

作用域鏈相當(dāng)于一個對象鏈表。鏈表的上的對象定義了這段script代碼中的變量。如果要查找一個變量x,則會從這個作用域鏈的當(dāng)前有權(quán)限訪問的最底層對象開始找起,如果這個對象有一個名叫x的屬性,則直接使用這個屬性的值,如果沒有找到繼續(xù)向外層找其他的對象上是否有這個屬性,直到找到作用域鏈的尾部,如果還沒有,就返回undefined。

這里的“里層,外層”就是內(nèi)部函數(shù)對包裹它的函數(shù)是不可訪問的,提前說明一下有利于之后的理解。

 


在如下所示的JavaScript頂層代碼中(不包含任何函數(shù)內(nèi)定義的代碼):

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

1 <script>2     'use strict';3     var a = "";4     function hello(){5 6     }7 </script>

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

它的作用域鏈只包含一個全局對象,作用域鏈組成如下:

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

在這段script代碼中,由于只有全局變量,所以只有一個全局作用域鏈。當(dāng)我們需要尋找a變量或者是hello函數(shù)的時候,就會去這個全局作用域鏈上找可訪問的最底層對象(也是僅有的一個對象)——全局對象,然后在他的屬性中找是否有a屬性或者h(yuǎn)ello屬性

網(wǎng)友評論