變量作用域
一個(gè)變量的作用域(scope)是程序源代碼中定義這個(gè)變量的區(qū)域。
全局變量擁有全局作用域忱嘹,在JavaScript代碼中的任何地方都是有定義的。然而在函數(shù)內(nèi)聲明的變量只在函數(shù)體內(nèi)有定義俱饿。它們是局部變量糟港,作用域也是局部性的。函數(shù)參數(shù)也是局部變量凯正,它們只在函數(shù)體內(nèi)有定義毙玻。
在函數(shù)體內(nèi),局部變量的優(yōu)先級(jí)高于同名的全局變量廊散。如果在函數(shù)內(nèi)聲明的一個(gè)局部變量或者函數(shù)參數(shù)中帶有的變量和全局變量重名桑滩,那么全局變量就被局部變量所遮蓋。
- 全局作用域
在代碼中任何地方都能訪問(wèn)到的對(duì)象擁有全局作用域允睹,一般來(lái)說(shuō)以下 3 種情形擁有全局作用域运准。
- 最外層函數(shù)和在最外層函數(shù)外面定義的變量擁有全局作用域
- 所有末定義直接賦值的變量自動(dòng)聲明為擁有全局作用域
- 所有window對(duì)象的屬性擁有全局作用域 window對(duì)象的內(nèi)置屬性都擁有全局作用域,例如 window.name缭受、window.location胁澳、window.top等。
- 局部作用域
和全局作用域相反米者,局部作用域一般只在固定的代碼片段內(nèi)可訪問(wèn)到听哭,最常見的例如函數(shù)內(nèi)部(函數(shù)作用域)。
作用域鏈
在JS中:一切皆是對(duì)象, 函數(shù)也是.
JS中作用域的概念和其他語(yǔ)言差不多, 在每次調(diào)用一個(gè)函數(shù)的時(shí)候 陆盘,就會(huì)進(jìn)入一個(gè)函數(shù)內(nèi)的作用域普筹,當(dāng)從函數(shù)返回以后,就返回調(diào)用前的作用域.
JS的語(yǔ)法風(fēng)格和C/C++類似, 但作用域的實(shí)現(xiàn)卻和C/C++不同隘马,并非用“堆椞溃”方式,而是使用列表酸员,具體過(guò)程如下(ECMA262中所述):
- 任何執(zhí)行上下文時(shí)刻的作用域, 都是由作用域鏈(scope chain)來(lái)實(shí)現(xiàn).
- 在一個(gè)函數(shù)被定義的時(shí)候, 會(huì)將它定義時(shí)刻的scope chain鏈接到這個(gè)函數(shù)對(duì)象的[[scope]]屬性.
- 在一個(gè)函數(shù)對(duì)象被調(diào)用的時(shí)候蜒车,會(huì)創(chuàng)建一個(gè)活動(dòng)對(duì)象(也就是一個(gè)對(duì)象), 然后對(duì)于每一個(gè)函數(shù)的形參,都命名為該活動(dòng)對(duì)象的命名屬性, 然后將這個(gè)活動(dòng)對(duì)象做為此時(shí)的作用域鏈(scope chain)最前端, 并將這個(gè)函數(shù)對(duì)象的[[scope]]加入到scope chain中.