關(guān)于作用域鏈

作用域

作用域就是變量和函數(shù)的可訪問范圍,控制著變量和函數(shù)的可見性與生命周期茁帽,在JavaScript中變量的作用域有全局作用域和局部作用域。

單純的JavaScript作用域還是很好理解的敏簿,JavaScript沒有塊級的作用域媳搪,只有函數(shù)級作用域:變量在聲明它們的函數(shù)體及其子函數(shù)內(nèi)是可見的。

變量沒有在函數(shù)內(nèi)聲明或者聲明的時候沒有帶var就是全局變量瞧毙,擁有全局作用域胧华,window對象的所有屬性擁有全局作用域;在代碼任何地方都可以訪問宙彪,函數(shù)內(nèi)部聲明并且以var修飾的變量就是局部變量矩动,只能在函數(shù)體內(nèi)使用,函數(shù)的參數(shù)雖然沒有使用var但仍然是局部變量释漆。

var a=3; //全局變量
function fn(b){ //局部變量
  c=2; //全局變量
  var d=5; //局部變量
  function subFn(){
    var e=d; //父函數(shù)的局部變量對子函數(shù)可見
    for(var i=0;i<3;i++){
      console.write(i);
    }
    alert(i);//3, 在for循環(huán)內(nèi)聲明悲没,循環(huán)外function內(nèi)仍然可見,沒有塊作用域
  }
}
alert(c); //在function內(nèi)聲明但不帶var修飾男图,仍然是全局變量
  • 聲明提前

聲明提前示姿,即JavaScript函數(shù)里的所有聲明都被提前到函數(shù)體的頂部,而變量賦值操作留在原來的位置逊笆。

console.log(a);    
var a = 1;
console.log(b);

實際上代碼如下:

var a;  //變量聲明提升到函數(shù)頂部
console.log(a);
a= 1;  //變量初始化依然保留在原來的位置
console.log(b);

作用域鏈

作用域鏈?zhǔn)亲饔糜蛞?guī)則的實現(xiàn)栈戳,通過作用域鏈的實現(xiàn),變量在它的作用域內(nèi)可被訪問难裆,函數(shù)在它的作用域內(nèi)可被調(diào)用子檀。

作用域鏈?zhǔn)且粋€只能單向訪問的鏈表,這個鏈表上的每個節(jié)點就是執(zhí)行上下文的變量對象(代碼執(zhí)行時就是活動對象)差牛,單向鏈表的頭部(可被第一個訪問的節(jié)點)始終都是當(dāng)前正在被調(diào)用執(zhí)行的函數(shù)的變量對象(活動對象)命锄,尾部始終是全局活動對象。

var a = 1
function fn1(){
  function fn2(){
    console.log(a)
  }
  function fn3(){
    var a = 4
    fn2()
  }
  var a = 2
  return fn3
}
var fn = fn1()
fn() //2

在函數(shù)運行過程中標(biāo)識符的解析是沿著作用域鏈一級一級搜索的過程偏化,從第一個對象開始脐恩,逐級向后回溯,直到找到同名標(biāo)識符為止侦讨,找到后不再繼續(xù)遍歷驶冒,找不到就報錯苟翻。

閉包

函數(shù)對象可以通過作用域鏈相互關(guān)聯(lián)起來,函數(shù)體內(nèi)的數(shù)據(jù)(變量和函數(shù)聲明)都可以保存在函數(shù)作用域內(nèi)骗污,這種特性在計算機(jī)科學(xué)文獻(xiàn)中被稱為“閉包”崇猫。既函數(shù)體內(nèi)的數(shù)據(jù)被隱藏于作用于鏈內(nèi),看起來像是函數(shù)將數(shù)據(jù)“包裹”了起來需忿。從技術(shù)角度來說诅炉,js的函數(shù)都是閉包:函數(shù)都是對象,都關(guān)聯(lián)到作用域鏈屋厘,函數(shù)內(nèi)數(shù)據(jù)都被保存在函 數(shù)作用域內(nèi)涕烧。

var count = (function() {   //定義函數(shù)并立即調(diào)用
  var counter = 0;       //函數(shù)的自由狀態(tài)
  return function() {return counter++;};
}());

這段代碼定義一個立即返回函數(shù),返回值賦值給變量count汗洒。這個函數(shù)返回另外一個函數(shù)议纯,也叫嵌套函數(shù),溢谤,既可以訪問作用域內(nèi)的變量又可以訪問外部函數(shù)變量counter瞻凤。當(dāng)外部函數(shù)返回之后,其他代碼無法訪問counter世杀,只有內(nèi)部函數(shù)可以訪問阀参。

其實理解了執(zhí)行環(huán)境和作用域鏈后,閉包翻了變成顯而易見的東西玫坛,但是也不能濫用閉包结笨,從上面例子可以看出,閉包會使子函數(shù)保持其作用域鏈的所有變量及函數(shù)與內(nèi)存中湿镀,內(nèi)存消耗很大炕吸,在使用的時候盡量銷毀父函數(shù)不再使用的變量。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末勉痴,一起剝皮案震驚了整個濱河市赫模,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蒸矛,老刑警劉巖瀑罗,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異雏掠,居然都是意外死亡斩祭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門乡话,熙熙樓的掌柜王于貴愁眉苦臉地迎上來摧玫,“玉大人,你說我怎么就攤上這事绑青∥芟瘢” “怎么了屋群?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長坏挠。 經(jīng)常有香客問我芍躏,道長,這世上最難降的妖魔是什么降狠? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任对竣,我火速辦了婚禮,結(jié)果婚禮上喊熟,老公的妹妹穿的比我還像新娘柏肪。我一直安慰自己,他們只是感情好芥牌,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著聂使,像睡著了一般壁拉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上柏靶,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天弃理,我揣著相機(jī)與錄音,去河邊找鬼屎蜓。 笑死痘昌,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的炬转。 我是一名探鬼主播辆苔,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼扼劈!你這毒婦竟也來了驻啤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤荐吵,失蹤者是張志新(化名)和其女友劉穎骑冗,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體先煎,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡贼涩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了薯蝎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遥倦。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖良风,靈堂內(nèi)的尸體忽然破棺而出谊迄,到底是詐尸還是另有隱情闷供,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布统诺,位于F島的核電站歪脏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏粮呢。R本人自食惡果不足惜婿失,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望啄寡。 院中可真熱鬧豪硅,春花似錦、人聲如沸挺物。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽识藤。三九已至砚著,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間痴昧,已是汗流浹背稽穆。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留赶撰,地道東北人舌镶。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像豪娜,于是被迫代替她去往敵國和親餐胀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

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