JavaScript學(xué)習(xí)筆記-作用域和作用域鏈

一、什么是作用域?

作用域是指變量或函數(shù)的有效范圍,我更個人的理解是把作用域看作是一套限制變量作用范圍的規(guī)則沈条,這個變量可以是基本數(shù)據(jù)類型(數(shù)值匾委、字符串拖叙、布爾類型),也可以是引用數(shù)據(jù)類型(對象赂乐、數(shù)組薯鳍、函數(shù)),作用域最根本的作用挨措,就是限制了變量的可讀取性挖滤,從而影響它的作用范圍。

1. 全局作用域

在函數(shù)外部聲明的變量浅役,可以在腳本的任意地方被使用斩松,這種變量稱之為全局變量(global variable),它的作用范圍被稱為全局作用域觉既。

var weather = 'sunny';//聲明全局變量weather
function weatheris(){
    var result = 'Today\'s weather is '+weather+'.';
    console.log(result);
}
weatheris();//Today's weather is sunny.

在上面的代碼中惧盹,函數(shù)weatheris里面并沒有聲明變量weather,但依然能調(diào)用weather的值,這是因為變量weather是在函數(shù)外部的全局環(huán)境下聲明瞪讼,其作用域是全局作用域钧椰,可以在該腳本所有位置所調(diào)用。
然而符欠,作為全局變量也意味著有可能在其他函數(shù)內(nèi)部不經(jīng)意地被修改嫡霞。

var weather = 'sunny';//聲明全局變量weather
function weatheris(){
    weather = 'cloudy';
    var result = 'Today\'s weather is '+ weather +'.';
    console.log(result);
}
weatheris();//Today's weather is cloudy.
console.log(weather);//cloudy

當(dāng)函數(shù)內(nèi)部修改了此前創(chuàng)建過的全局變量的時候,不單單只是在函數(shù)內(nèi)部生效希柿,同時也對全局環(huán)境下其他引用了這個 變量的地方生效诊沪。上述例子中,在函數(shù)weatheris里面修改了全局變量weather以后狡汉,weather的值就被修改了娄徊。

2. 函數(shù)作用域

在函數(shù)內(nèi)部聲明的變量就是局部變量(local variable)闽颇。與全局變量相反盾戴,局部變量只能在聲明該變量的函數(shù)內(nèi)部所讀取,在函數(shù)外部是無法被讀取和調(diào)用的兵多。

function weatheris() {
    var weather = 'sunny';
    console.log(weather);
} 
weatheris()//sunny
console.log(weather);//報錯:weather is not defined

我們可以看到尖啡,在函數(shù)內(nèi)部聲明的變量weather,可以被立即調(diào)用剩膘,但是脫離了函數(shù)以后衅斩,輸出weather卻顯示變量未被聲明。在這種情況下怠褐,我們一般稱變量weather為局部變量畏梆,其作用域稱為函數(shù)作用域或者局部作用域。


二、什么是作用域鏈奠涌?

當(dāng)代碼進(jìn)入一個環(huán)境中執(zhí)行的時候宪巨,會創(chuàng)建變量對象的一個作用域鏈。我個人把作用域鏈理解為一套對變量進(jìn)行訪問和查找的規(guī)則溜畅,它絕對了在當(dāng)前執(zhí)行環(huán)境下捏卓,有哪些變量是可以被訪問,如果當(dāng)前執(zhí)行環(huán)境下沒有這個變量慈格,又應(yīng)該去哪里查找怠晴。
先看一個簡單的例子:

function weatheris(){
    var weather = 'sunny';
    function result(){
        console.log ('Today\'s weather is '+ weather);
    }
    result();
}//聲明函數(shù)weatheris
weatheris();//Today's weather is sunny.

如果不了解作用域鏈的同學(xué)就會產(chǎn)生疑問,為什么函數(shù)result可以調(diào)用變量weather呢浴捆?weather明明不是在result內(nèi)部聲明的呀蒜田?

這是因為,result函數(shù)是在weatheris函數(shù)的函數(shù)作用域里面选泻,換句話來說物邑,這兩個函數(shù)的作用域嵌套了,解析器無法再result函數(shù)里面找到變量weather的時候滔金,就會向上色解,來到聲明函數(shù)result的那一層作用域里面尋找,找到以后就會訪問這個變量獲取其值餐茵,放回result函數(shù)里面進(jìn)行調(diào)用科阎。而上述的一系列的過程,正是作用域鏈運(yùn)用的體現(xiàn)忿族,所以我把它理解為一套對變量進(jìn)行訪問和查找的規(guī)則锣笨。

需要注意的是,上述代碼之所以能正確被解析并執(zhí)行的一個關(guān)鍵點道批,在于兩個函數(shù)作用域的嵌套错英。作用域只能被嵌套,不能重疊隆豹。假如我們把上述的部分代碼的位置改變一下:

function weatheris(){
    var weather = 'sunny';
}
function result(){
    console.log ('Today\'s weather is '+ weather);
    }
result();//保存weather is not defined
weatheris();//只是在weatheris函數(shù)作用域內(nèi)聲明了變量weather椭岩,賦值為‘sunny’。

上面代碼中璃赡,函數(shù)weatheris和函數(shù)result兩者的函數(shù)作用域是平行的判哥,也就是說兩者內(nèi)部的變量都無法被相互訪問,所以出現(xiàn)了報錯提示weather is not defined碉考,也無法達(dá)到我們想要的效果塌计。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市侯谁,隨后出現(xiàn)的幾起案子锌仅,更是在濱河造成了極大的恐慌章钾,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件热芹,死亡現(xiàn)場離奇詭異伍玖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)剿吻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門窍箍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人丽旅,你說我怎么就攤上這事椰棘。” “怎么了榄笙?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵邪狞,是天一觀的道長。 經(jīng)常有香客問我茅撞,道長帆卓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任米丘,我火速辦了婚禮剑令,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拄查。我一直安慰自己吁津,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布堕扶。 她就那樣靜靜地躺著碍脏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪稍算。 梳的紋絲不亂的頭發(fā)上典尾,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機(jī)與錄音糊探,去河邊找鬼钾埂。 笑死,一個胖子當(dāng)著我的面吹牛侧到,可吹牛的內(nèi)容都是我干的勃教。 我是一名探鬼主播淤击,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼匠抗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了污抬?” 一聲冷哼從身側(cè)響起汞贸,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤绳军,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后矢腻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體门驾,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年多柑,在試婚紗的時候發(fā)現(xiàn)自己被綠了奶是。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡竣灌,死狀恐怖聂沙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情初嘹,我是刑警寧澤及汉,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站屯烦,受9級特大地震影響坷随,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜驻龟,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一温眉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧翁狐,春花似錦芍殖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至隐锭,卻和暖如春窃躲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钦睡。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工蒂窒, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人荞怒。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓洒琢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親褐桌。 傳聞我的和親對象是個殘疾皇子衰抑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

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