JS作用域和作用域鏈

作用域

作用域是JavaScript最重要的概念之一。任何程序設(shè)計(jì)語(yǔ)言都有作用域的概念德崭,簡(jiǎn)單來(lái)說(shuō)福铅,作用域就是變量與函數(shù)的可訪問(wèn)范圍,即作用域控制著變量與函數(shù)的可見(jiàn)性和生命周期狸演。在JavaScript中言蛇,作用域是靠函數(shù)來(lái)形成的,也就是說(shuō)一個(gè)函數(shù)的變量在函數(shù)外不可以訪問(wèn)宵距。

1. 全局作用域

在代碼中任何地方都能訪問(wèn)到的對(duì)象擁有全局作用域腊尚。

  1. 最外層函數(shù)和在最外層函數(shù)外面定義的變量擁有全局作用域
var n =2;

function fn(){
    var a = 1;
    return a;
}

console.log(fn()); // 1
console.log(n); // 2
console.log(a); // 報(bào)錯(cuò)error

  1. 所有未定義直接賦值的變量自動(dòng)聲明為擁有全局作用域
var n =2;

function fn(){
    a = 1;
    return a;
}

console.log(fn()); // 1
console.log(n); // 2
console.log(a); // 1

  1. 所有window對(duì)象的屬性擁有全局作用域

2 .局部作用域

和全局作用域相反,局部作用域一般只在固定的代碼片段內(nèi)可訪問(wèn)到满哪,最常見(jiàn)的例如函數(shù)內(nèi)部婿斥,所以在一些地方會(huì)把這種作用域成為函數(shù)作用域。

var n =2;

function fn(){
    var a = 1;
    return a;
}

console.log(fn()); // 1
console.log(n); // 2
console.log(a); // 報(bào)錯(cuò)error

上述代碼中a是函數(shù)內(nèi)部聲明并賦值翩瓜,擁有局部作用域受扳,只能帶函數(shù)fn內(nèi)部使用,在fn外部使用就會(huì)報(bào)錯(cuò)兔跌,這就是局部作用域的特性勘高,只能在固定的代碼片段內(nèi)可以使用,外部則無(wú)法訪問(wèn)。

作用域鏈

當(dāng)聲明一個(gè)函數(shù)時(shí)华望,局部作用域一級(jí)一級(jí)向上扣起來(lái)蕊蝗,就是作用域鏈。

1. 當(dāng)執(zhí)行函數(shù)時(shí)赖舟,總是先從函數(shù)內(nèi)部找尋變量蓬戚,即局部作用域開(kāi)始。

2. 如果內(nèi)部找不到(函數(shù)的局部作用域沒(méi)有)宾抓,則會(huì)向創(chuàng)建函數(shù)的作用域(聲明函數(shù)的作用域)尋找子漩,依次向上

看個(gè)例子:

var a = 1;
function fn(){
    var a = 10;
    function fn1(){
        var a = 20;
        console.log(a); //20
    }
    function fn2(){
        console.log(a); //10
    }
    fn1();
    fn2();
}

fn();
console.log(a); //1

當(dāng)執(zhí)行fn1時(shí),創(chuàng)建函數(shù)fn1的執(zhí)行環(huán)境(調(diào)用對(duì)象)石洗,并將該對(duì)象置于鏈表開(kāi)頭幢泼,然后將函數(shù)fn的調(diào)用對(duì)象放在第二位,最后是全局對(duì)象讲衫,作用域鏈的鏈表的結(jié)構(gòu)是fn1->fn->window(全局)缕棵。從鏈表的開(kāi)頭尋找變量a,即fn1函數(shù)內(nèi)部找變量a涉兽,找到了招驴,結(jié)果是20。

同樣枷畏,執(zhí)行fn2時(shí)别厘,作用域鏈的鏈表的結(jié)構(gòu)是fn2->fn->window(全局)。從鏈表的開(kāi)頭尋找變量a矿辽,即fn2函數(shù)內(nèi)部找變量a丹允,找不到,于是從fn內(nèi)部找變量a袋倔,找到了雕蔽,結(jié)果是10。

最后在最外層打印出變量a宾娜,直接從變量a的作用域即全局作用域內(nèi)尋找批狐,結(jié)果為1。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末前塔,一起剝皮案震驚了整個(gè)濱河市嚣艇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌华弓,老刑警劉巖食零,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異寂屏,居然都是意外死亡贰谣,警方通過(guò)查閱死者的電腦和手機(jī)娜搂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)吱抚,“玉大人百宇,你說(shuō)我怎么就攤上這事∶乇” “怎么了携御?”我有些...
    開(kāi)封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)既绕。 經(jīng)常有香客問(wèn)我啄刹,道長(zhǎng),這世上最難降的妖魔是什么凄贩? 我笑而不...
    開(kāi)封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任鸵膏,我火速辦了婚禮,結(jié)果婚禮上怎炊,老公的妹妹穿的比我還像新娘。我一直安慰自己廓译,他們只是感情好评肆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著非区,像睡著了一般瓜挽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上征绸,一...
    開(kāi)封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天久橙,我揣著相機(jī)與錄音,去河邊找鬼管怠。 笑死淆衷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的渤弛。 我是一名探鬼主播祝拯,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼她肯!你這毒婦竟也來(lái)了佳头?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤晴氨,失蹤者是張志新(化名)和其女友劉穎康嘉,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體籽前,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡亭珍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年敷钾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片块蚌。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡闰非,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出峭范,到底是詐尸還是另有隱情财松,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布纱控,位于F島的核電站辆毡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏甜害。R本人自食惡果不足惜舶掖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望尔店。 院中可真熱鬧眨攘,春花似錦、人聲如沸嚣州。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)该肴。三九已至情竹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匀哄,已是汗流浹背秦效。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留涎嚼,地道東北人阱州。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像法梯,于是被迫代替她去往敵國(guó)和親贡耽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

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

  • 一鹊汛、作用域 作用域就是變量和函數(shù)的可訪問(wèn)范圍蒲赂,控制著變量和函數(shù)的可見(jiàn)性與生命周期,在JavaScript中變量的作...
    50153465fcd8閱讀 259評(píng)論 0 1
  • 前天被問(wèn)到作用域鏈的知識(shí)刁憋,感覺(jué)有個(gè)大概的認(rèn)識(shí)滥嘴,但是轉(zhuǎn)化為語(yǔ)言就無(wú)法調(diào)理清楚地講述出來(lái),回來(lái)后決定惡補(bǔ)功課至耻,在此做個(gè)...
    栗子酥小小閱讀 334評(píng)論 0 0
  • 一晦譬、函數(shù)的作用域 首先,作用域就是指變量的作用范圍然后互广,在JS中只有兩個(gè)作用域:1.全局作用域敛腌,2.局部作用域(函...
    大春春閱讀 531評(píng)論 0 6
  • 東門好,風(fēng)景舊成諳惫皱。 日出攤販紅勝火像樊,日落煙火不了然。 能不憶東門旅敷?
    喵夢(mèng)璃凪閱讀 102評(píng)論 0 0
  • 我是高中生生棍,每天除了學(xué)習(xí)就是搞怪,我會(huì)記錄一些學(xué)習(xí)間隙里的小故事媳谁,當(dāng)然學(xué)習(xí)中的也可以涂滴,記錄我們?cè)诼飞系那啻?..
    周不才閱讀 198評(píng)論 0 1