作用域鏈(Scope Chain)

JavaScript是基于詞法作用域的語言:通過閱讀包含變量定義在內(nèi)的數(shù)行源碼就能知道變量的作用域。全局變量在程序中始終是有定義的考杉。局部變量在聲明它的函數(shù)體內(nèi)以及所嵌套的函數(shù)內(nèi)始終是有定義的。

Tips:
1.在函數(shù)體內(nèi),局部變量的優(yōu)先級高于同名的全局變量。
2.在全局作用域編寫代碼是可以不寫var語句踱承,但聲名局部變量時,必須使用var語句哨免,如果省略 var 操作符茎活,那么聲明的變量就是全局變量,擁有全局作用域铁瞒。
3.JS中沒有塊級作用域妙色,而是使用函數(shù)作用域:變量在聲明它們的函數(shù)體內(nèi)以及所嵌套的任意函數(shù)內(nèi)始終是有定義的桅滋。這意味著變量在聲明之前甚至已經(jīng)可用慧耍,即JS的聲明提前(hoisting),意思是JS函數(shù)里聲明的所有變量(但不涉及賦值)都被“提前”至函數(shù)的頂部丐谋。

如果將一個局部變量看作是自定義實現(xiàn)的對象的屬性的話芍碧,那么可以換個角度來解讀變量作用域。每一段JavaScript代碼(全局代碼或函數(shù))都有一個與之關(guān)聯(lián)的作用域鏈(scope chain)号俐。這個作用域鏈?zhǔn)且粋€對象列表或者鏈表泌豆,這組對象定義了這段代碼“作用域中”的變量。當(dāng)JavaScript需要查找變量x的值的時候(這個過程稱作“變量解析”(variable resolution))吏饿,它會從鏈中的第一個對象開始查找踪危,如果這個對象有一個名為x的屬性,則會直接使用這個屬性的值猪落,如果第一個對象中不存在名為x的屬性贞远,JavaScript會繼續(xù)查找鏈上的下一個對象。如果第二個對象依然沒有名為x的屬性笨忌,則會繼續(xù)查找下一個對象蓝仲,以此類推。如果作用域鏈上沒有任何一個對象含有屬性x官疲,那么就認(rèn)為這段代碼的作用域鏈上不存在x袱结,并最終拋出一個引用錯誤(ReferenceError)異常。

我們可以認(rèn)為:
1.函數(shù)的局部環(huán)境可以訪問函數(shù)作用域中的變量途凫,也可以訪問和操作父環(huán)境乃至全局環(huán)境中的變量垢夹。
2.父環(huán)境只能訪問其包含環(huán)境和自己環(huán)境中的變量和函數(shù),不能訪問其子環(huán)境中的變量和函數(shù)维费。
3.全局環(huán)境只能訪問全局環(huán)境中的變量和函數(shù)棚饵,不能直接訪問局部環(huán)境中的任何數(shù)據(jù)煤裙。

在JavaScript最頂層代碼中(也就是不包含在任何函數(shù)定義內(nèi)的代碼),作用域鏈由一個全局對象組成噪漾。在不包含嵌套的函數(shù)體內(nèi)硼砰,作用域鏈上有兩個對象,第一個是定義函數(shù)參數(shù)和局部變量的對象欣硼,第二個是全局對象题翰。在一個嵌套的函數(shù)體內(nèi),作用域鏈上至少有三個對象诈胜。理解對象鏈的創(chuàng)建規(guī)則是非常重要的豹障。當(dāng)定義一個函數(shù)時,它實際上保存一個作用域鏈焦匈。當(dāng)調(diào)用這個函數(shù)時血公,它創(chuàng)建一個新的對象來存儲它的局部變量,并將這個對象添加至保存的那個作用域鏈上缓熟,同時創(chuàng)建一個新的更長的表示函數(shù)調(diào)用作用域的“鏈”累魔。對于嵌套函數(shù)來講,事情變得更加有趣够滑,每次調(diào)用外部函數(shù)時垦写,內(nèi)部函數(shù)又會重新定義一遍。因為每次調(diào)用外部函數(shù)的時候彰触,作用域鏈都是不同的梯投。內(nèi)部函數(shù)在每次定義的時候都有微妙的差別——在每次調(diào)用外部函數(shù)時,內(nèi)部函數(shù)的代碼都是相同的况毅,而且關(guān)聯(lián)這段代碼的作用域鏈也不相同.

(摘抄參考于《JS權(quán)威指南》和《JS高級程序設(shè)計》)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末分蓖,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子尔许,更是在濱河造成了極大的恐慌么鹤,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件母债,死亡現(xiàn)場離奇詭異午磁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)毡们,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門迅皇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人衙熔,你說我怎么就攤上這事登颓。” “怎么了红氯?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵框咙,是天一觀的道長咕痛。 經(jīng)常有香客問我,道長喇嘱,這世上最難降的妖魔是什么茉贡? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮者铜,結(jié)果婚禮上腔丧,老公的妹妹穿的比我還像新娘。我一直安慰自己作烟,他們只是感情好愉粤,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拿撩,像睡著了一般衣厘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上压恒,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天影暴,我揣著相機(jī)與錄音,去河邊找鬼涎显。 笑死坤检,一個胖子當(dāng)著我的面吹牛兴猩,可吹牛的內(nèi)容都是我干的期吓。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼倾芝,長吁一口氣:“原來是場噩夢啊……” “哼讨勤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起晨另,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤潭千,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后借尿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刨晴,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年路翻,在試婚紗的時候發(fā)現(xiàn)自己被綠了狈癞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡茂契,死狀恐怖蝶桶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情掉冶,我是刑警寧澤真竖,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布脐雪,位于F島的核電站,受9級特大地震影響恢共,放射性物質(zhì)發(fā)生泄漏战秋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一讨韭、第九天 我趴在偏房一處隱蔽的房頂上張望获询。 院中可真熱鬧,春花似錦拐袜、人聲如沸吉嚣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尝哆。三九已至,卻和暖如春甜攀,著一層夾襖步出監(jiān)牢的瞬間秋泄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工规阀, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留恒序,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓谁撼,卻偏偏與公主長得像歧胁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子厉碟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容

  • JavaScript 中有一個很重要很重要很重要的概念就是閉包喊巍。重要的事情要說三遍!敲敲黑板箍鼓,打瞌睡的同學(xué)醒醒崭参,下...
    Dimen_閱讀 936評論 2 9
  • 為了更好的理解作用域鏈,先做些準(zhǔn)備工作 1.作用域 在JavaScript中款咖,我們可以將作用域定義為一套規(guī)則,這套...
    易景平閱讀 221評論 0 0
  • 在 JavaScript 中何暮,函數(shù)也是對象,實際上铐殃,JavaScript 里一切都是對象海洼。函數(shù)對象和其它對象一樣,...
    紅豆丁244閱讀 152評論 0 0
  • 作用域鏈: JS權(quán)威指南指出”JavaScript中的函數(shù)運(yùn)行在它們被定義的作用域里,而不是它們被執(zhí)行的作用域里....
    YYPL閱讀 2,412評論 0 1
  • 麥子熟了 文/雄關(guān)漫道 五月背稼,麥子熟了 小時候 麥子是我 永遠(yuǎn)的渴望 饑一頓飽一頓的生活 就像永遠(yuǎn)的鄉(xiāng)間...
    閆殿才閱讀 361評論 2 5