作用域鏈

1、什么是作用域鏈?

JavaScript中,JavaScript里一切都是對(duì)象,包括函數(shù)。函數(shù)對(duì)象和其它對(duì)象一樣,擁有可以通過(guò)代碼訪問(wèn)的屬性和一系列僅供JavaScript引擎訪問(wèn)的內(nèi)部屬性。其中一個(gè)內(nèi)部屬性是作用域,包含了函數(shù)被創(chuàng)建的作用域中對(duì)象的集合,稱為函數(shù)的作用域鏈。

作用域(scope)

通常來(lái)說(shuō)一段程序代碼中使用的變量和函數(shù)并不總是可用的,限定其可用性的范圍即作用域,作用域的使用提高了程序邏輯的局部性,增強(qiáng)程序的可靠性,減少名字沖突。

作用域鏈作用(scope chain)

作用域鏈決定了哪些數(shù)據(jù)能被函數(shù)訪問(wèn)。當(dāng)一個(gè)函數(shù)創(chuàng)建后,它的作用域鏈會(huì)被創(chuàng)建此函數(shù)的作用域中可訪問(wèn)的數(shù)據(jù)對(duì)象填充。

var color = "blue";
function changeColor(){
 if (color === "blue"){
 color = "red";
 } else {
 color = "blue";
 }
}
changeColor();
alert("Color is now " + color); 

在這個(gè)簡(jiǎn)單的例子中,函數(shù) changeColor()的作用域鏈包含兩個(gè)對(duì)象:它自己的變量對(duì)象(其中定義著 arguments 對(duì)象)和全局環(huán)境的變量對(duì)象??梢栽诤瘮?shù)內(nèi)部訪問(wèn)變量 color,就是因?yàn)榭梢栽谶@個(gè)作用域鏈中找到它。

此外,在局部作用域中定義的變量可以在局部環(huán)境中與全局變量互換使用,如下面這個(gè)例子所示

var color = "blue";
function changeColor(){
 var anotherColor = "red";
 function swapColors(){
 var tempColor = anotherColor;
 anotherColor = color;
 color = tempColor;

 // 這里可以訪問(wèn) color、anotherColor 和 tempColor
 }
 // 這里可以訪問(wèn) color 和 anotherColor,但不能訪問(wèn) tempColor
 swapColors();
}
// 這里只能訪問(wèn) color
changeColor(); 

以上代碼共涉及 3 個(gè)執(zhí)行環(huán)境:全局環(huán)境、changeColor()的局部環(huán)境和 swapColors()的局部環(huán)境。

全局環(huán)境中有一個(gè)變量 color 和一個(gè)函數(shù) changeColor()。
changeColor()的局部環(huán)境中有一個(gè)名為 anotherColor 的變量和一個(gè)名為 swapColors()的函數(shù),但它也可以訪問(wèn)全局環(huán)境中的變量 color。
swapColors()的局部環(huán)境中有一個(gè)變量 tempColor,該變量只能在這個(gè)環(huán)境中訪問(wèn)到。

無(wú)論全局環(huán)境還是 changeColor()的局部環(huán)境都無(wú)權(quán)訪問(wèn) tempColor。然而,在 swapColors()內(nèi)部則可以訪問(wèn)其他兩個(gè)環(huán)境中的所有變量,因?yàn)槟莾蓚€(gè)環(huán)境是它的父執(zhí)行環(huán)境。
下圖形象地展示了前面這個(gè)例子的作用域鏈。


image.png

圖中的矩形表示特定的執(zhí)行環(huán)境。其中,內(nèi)部環(huán)境可以通過(guò)作用域鏈訪問(wèn)所有的外部環(huán)境,但外部環(huán)境不能訪問(wèn)內(nèi)部環(huán)境中的任何變量和函數(shù)。這些環(huán)境之間的聯(lián)系是線性、有次序的。

每個(gè)環(huán)境都可以向上搜索作用域鏈,以查詢變量和函數(shù)名;但任何環(huán)境都不能通過(guò)向下搜索作用域鏈而進(jìn)入另一個(gè)執(zhí)行環(huán)境。對(duì)于這個(gè)例子中的 swapColors()而言,其作用域鏈中包含 3 個(gè)對(duì)象:swapColors()的變
量對(duì)象、changeColor()的變量對(duì)象和全局變量對(duì)象。swapColors()的局部環(huán)境開(kāi)始時(shí)會(huì)先在自己的變量對(duì)象中搜索變量和函數(shù)名,

如果搜索不到則再搜索上一級(jí)作用域鏈。changeColor()的作用域鏈中只包含兩個(gè)對(duì)象:它自己的變量對(duì)象和全局變量對(duì)象。這也就是說(shuō),它不能訪問(wèn) swapColors()的環(huán)境。

(參考閱讀《JS高級(jí)程序設(shè)計(jì)》這本書)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 作用域與作用域鏈 一、作用域 一個(gè)變量的作用域(scope)是程序源代碼中定義的這個(gè)變量的區(qū)域。 在JS中使用的是...
    e81bcd463937閱讀 606評(píng)論 0 2
  • 變量 變量分為全局變量和局部變量,全局變量就是指該變量的作用域?yàn)楫?dāng)前文檔,也就是說(shuō)全局變量在當(dāng)前文檔的所有Java...
    jrg陳咪咪sunny閱讀 440評(píng)論 0 1
  • 作用域 變量作用域有兩種:全局變量和局部變量。 變量在函數(shù)外定義,即為全局變量,全局變量有全局作用域:網(wǎng)頁(yè)中所有腳...
    饑人谷_王若曦閱讀 416評(píng)論 0 0
  • 任何程序設(shè)計(jì)語(yǔ)言都有作用域的概念,簡(jiǎn)單的說(shuō),作用域控制著變量與函數(shù)的可見(jiàn)性和生命周期。ES6之前,JS變量的作用域...
    卓三陽(yáng)閱讀 686評(píng)論 0 2
  • 一、初級(jí)快樂(lè):是別人給的快樂(lè); 二、中級(jí)快樂(lè):是自己努力得到的快樂(lè); 三、高級(jí)快樂(lè):是付出的快樂(lè); 四、超級(jí)快樂(lè):...
    懿靖閱讀 516評(píng)論 0 0

友情鏈接更多精彩內(nèi)容