JavaScript 執(zhí)行環(huán)境奕锌、作用域和閉包

一、幾個(gè)概念村生,

執(zhí)行環(huán)境(execution context)惊暴,定義了變量或函數(shù)有權(quán)訪問的其他數(shù)據(jù),決定了它們各自的行為梆造。
變量對(duì)象(variable object)缴守,環(huán)境中定義的所有變量和函數(shù)都保存在這個(gè)對(duì)象中葬毫。如果該環(huán)境是函數(shù),變量對(duì)象就是活動(dòng)對(duì)象屡穗,活動(dòng)對(duì)象最初只包含一個(gè)變量贴捡,即 arguments 對(duì)象。
每個(gè)執(zhí)行環(huán)境都有一個(gè)與之關(guān)聯(lián)的變量對(duì)象村砂。
某個(gè)執(zhí)行環(huán)境中的所有代碼執(zhí)行完畢后烂斋,該環(huán)境被銷毀,保存在其中的所有變量和函數(shù)定義也隨之銷毀(全局執(zhí)行環(huán)境直到應(yīng)用程序退出础废,如關(guān)閉網(wǎng)頁或?yàn)g覽器汛骂,才被銷毀)。也就是進(jìn)行自動(dòng)垃圾回收评腺。

作用域鏈(scope chain)帘瞭,當(dāng)執(zhí)行流進(jìn)入一個(gè)函數(shù)時(shí),函數(shù)環(huán)境就會(huì)被推入一個(gè)環(huán)境棧蒿讥,在函數(shù)執(zhí)行之后蝶念,棧將其環(huán)境彈出,把控權(quán)返回給之前的執(zhí)行環(huán)境芋绸。作用域鏈就是環(huán)境棧媒殉。

二、有一段代碼摔敛,放在全局作用域中廷蓉,

function func1() {
    console.log('func1');
    function func2(){
        console.log('func2');
    }
    func2();
}

function func3() {
    console.log('func3');
}

func1();
func3();

這段代碼的作用域可以這樣理解,開始時(shí)马昙,作用域鏈(環(huán)境棧)只有 Global(Window)桃犬,當(dāng)執(zhí)行 func1(),作用域鏈(環(huán)境棧)推入 func1给猾,變成:

func1, Global

查找任何變量疫萤,先在 func1 的執(zhí)行環(huán)境中找,如果找不到敢伸,再在 Global 的執(zhí)行環(huán)境中找。

當(dāng)執(zhí)行到 func2()恒削,作用域鏈(環(huán)境棧)推入 func1池颈,變成:

func2, func1, Global

func2 執(zhí)行完畢后,func2 的環(huán)境被銷毀钓丰,內(nèi)存釋放躯砰,作用域鏈(環(huán)境棧)變?yōu)椋?/p>

func1, Global

func1 執(zhí)行完畢,作用域鏈(環(huán)境棧)變?yōu)椋?/p>

Global

再執(zhí)行 func3携丁,作用域鏈(環(huán)境棧)變?yōu)椋?/p>

func3, Global

func3 執(zhí)行完畢琢歇,作用域鏈(環(huán)境棧)變?yōu)椋?/p>

Global

當(dāng)瀏覽器(或標(biāo)簽)關(guān)閉兰怠,Global 銷毀。

正如這幅圖李茫,每個(gè)內(nèi)部作用域都可以依次訪問它外部的每個(gè)作用域揭保,但外部作用域不能訪問內(nèi)部作用域。

三魄宏、閉包

閉包是指有權(quán)訪問另一個(gè)函數(shù)作用域中的變量的函數(shù)秸侣。創(chuàng)建閉包的常見方式,是在一個(gè)函數(shù)內(nèi)部創(chuàng)建另一個(gè)函數(shù)宠互。

閉包本質(zhì)上是味榛,函數(shù)執(zhí)行完畢后,若其活動(dòng)對(duì)象仍然被引用予跌,則執(zhí)行環(huán)境的作用域鏈會(huì)被銷毀搏色,但它的活動(dòng)對(duì)象仍然會(huì)留在內(nèi)存中。

由于閉包會(huì)攜帶包含它的函數(shù)的作用域券册,因此會(huì)比其他函數(shù)占用更多的內(nèi)存频轿。過度使用閉包可能會(huì)導(dǎo)致內(nèi)存占用過多,只在絕對(duì)必要時(shí)再考慮使用閉包汁掠。

閉包涉及的問題:

1.內(nèi)存泄漏略吨,應(yīng)該把不用的全局變量、全局函數(shù)考阱、引起循環(huán)引用的變量設(shè)置為 null

2.閉包保存著外部函數(shù)的作用域翠忠,因此無法獲得循環(huán)下標(biāo)

(function(){
var n=2;

for(var i=0; i< Math.pow(10, n); i++){
    var button = document.createElement('button');
    document.body.appendChild(button);
}

var buttonArray = document.getElementsByTagName('button');

for(var j=0; j<buttonArray.length; j++){
    // 返回都是 10^n 
    buttonArray[j].onclick = function(){
        console.log(j);
    }
}
})();

3.閉包無法獲取 this,可以在外部把它保存起來

var self = this;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末乞榨,一起剝皮案震驚了整個(gè)濱河市秽之,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吃既,老刑警劉巖考榨,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異鹦倚,居然都是意外死亡河质,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門震叙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掀鹅,“玉大人,你說我怎么就攤上這事媒楼±肿穑” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵划址,是天一觀的道長(zhǎng)扔嵌。 經(jīng)常有香客問我限府,道長(zhǎng),這世上最難降的妖魔是什么痢缎? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任胁勺,我火速辦了婚禮,結(jié)果婚禮上牺弄,老公的妹妹穿的比我還像新娘姻几。我一直安慰自己,他們只是感情好势告,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布蛇捌。 她就那樣靜靜地躺著,像睡著了一般咱台。 火紅的嫁衣襯著肌膚如雪络拌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天回溺,我揣著相機(jī)與錄音春贸,去河邊找鬼。 笑死遗遵,一個(gè)胖子當(dāng)著我的面吹牛萍恕,可吹牛的內(nèi)容都是我干的僧诚。 我是一名探鬼主播硼被,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼问芬!你這毒婦竟也來了翼岁?” 一聲冷哼從身側(cè)響起类垫,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎琅坡,沒想到半個(gè)月后悉患,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡榆俺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年售躁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茴晋。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡迂求,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出晃跺,到底是詐尸還是另有隱情,我是刑警寧澤毫玖,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布掀虎,位于F島的核電站凌盯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏烹玉。R本人自食惡果不足惜驰怎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望二打。 院中可真熱鬧县忌,春花似錦、人聲如沸继效。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瑞信。三九已至厉颤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間凡简,已是汗流浹背逼友。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留秤涩,地道東北人帜乞。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像筐眷,于是被迫代替她去往敵國(guó)和親黎烈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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