深入理解閉包(一)——鋪墊

原文地址:深入理解閉包(一)——鋪墊

前兩天寫了一篇關(guān)于作用域和作用域鏈的文章,還自以為理解透了,這兩天一直在琢磨閉包,才發(fā)現(xiàn)我之前對作用域和作用域鏈的理解簡直不忍直視沼溜,甚至那個時候我還以為執(zhí)行上下文跟作用域是同一個東西,哇現(xiàn)在真想死一死游添∠挡荩看了那么多講閉包的文章之后我也得出一個經(jīng)驗,一篇文章是講不清閉包的唆涝,因為你需要理解的不僅僅是閉包找都,還有前面需要鋪墊的很多知識,所以我打算寫一個系列文廊酣,今天我就先回憶一些基礎(chǔ)知識能耻。

堆與棧

堆與棧是兩種數(shù)據(jù)結(jié)構(gòu),棧在javascript的執(zhí)行上下文中有重要體現(xiàn)亡驰,因此我們有必要去弄懂它晓猛。

堆的存取方式比較靈活,程序員為數(shù)據(jù)分配空間進行存儲凡辱,引用數(shù)據(jù)時只需要知道數(shù)據(jù)存在了那個地址就可以使用戒职,就像是我們?nèi)D書館找一本書,只需要知道這本書的編號就能知道書的位置煞茫,找到對應(yīng)的書架找到想要的書帕涌。


棧的存取方式遵循先進后出原則。如上圖:存儲數(shù)據(jù)時续徽,1最先入棧,4最后入棧亲澡;使用數(shù)據(jù)時钦扭,4最先出棧,1最后出棧床绪。大家都打過羽毛球吧客情,裝羽毛球的長筒就類似于這個棧,桶口就一個癞己,我們每次只能拿出最上面的那個球膀斋,要想拿出下面的球就必須把它上面的都拿出來。

數(shù)據(jù)的基本類型和引用類型

基本數(shù)據(jù)類型

基本類型值指的是簡單數(shù)據(jù)段,JavaScript中有5中基本數(shù)據(jù)類型痹雅,分別是Undefined仰担、Null、Boolean绩社、Number摔蓝、String赂苗。基本數(shù)據(jù)類型是按值訪問,如果從一個變量向另一個變量復(fù)制基本類型的值贮尉,會在變量對象上創(chuàng)建一個新值拌滋,把該值復(fù)制到為新變量分配的位置上。
舉個栗子:

var num1 = 5;
var num2 = num1;

num1中保存的值是5猜谚,又定義一個變量num2败砂,并用num1的值來初始化它,那么num1的5就復(fù)制給了num2魏铅,但這兩個5是互相獨立的昌犹,誰都不影響誰,即使你改變了其中一個的值沦零,另外一個也不會受到影響祭隔。

引用數(shù)據(jù)類型

引用類型值指的是那些可能由多個值構(gòu)成的對象,如數(shù)組路操。引用數(shù)據(jù)類型是按引用訪問的疾渴,當一個變量向另一個變量復(fù)制引用類型值的時候,復(fù)制的不是一個值而是一個指向這個值的指針屯仗,復(fù)制操作結(jié)束后搞坝,兩個變量實際上將引用同一個對象,因此改變其中一變量魁袜,另一個也隨之改變桩撮。
舉個栗子:

var obj1 = new Object();
var obj2 = obj1;
obj1.name = "Nicholas";
alert(obj2.name);   //"Nicholas"

首先,變量obj1保存了一個對象的新實例峰弹,然后這個值被復(fù)制到了obj2中店量,此時它們都指向同一個對象,因此當我們給obj1添加name屬性后鞠呈,可以通過obj2來訪問這個屬性融师,如果你還不理解,那么你看完下圖就會了然了蚁吝。

下面我們看兩個小測試來檢測一下自己對上面內(nèi)容的理解

var a = 10;
var b = a;
b = 30;
console.log(a);  //10
var m = { a: 10, b: 20 }
var n = m;
n.a = 30;
console.log(m.a);  //30 

垃圾回收機制

函數(shù)中局部變量經(jīng)歷一個生命周期:

  1. 當我們定義一個變量時旱爆,會為它分配一個內(nèi)存空間用來儲存變量的值
  2. 當我們讀取或使用這個變量時,會使用它的內(nèi)存空間
  3. 使用完畢時會釋放內(nèi)存空間

上面生命周期的最后一步窘茁,其實就是垃圾回收怀伦。JavaScript有自動垃圾收集機制,就是找出那些不再繼續(xù)使用的值山林,然后釋放其占用的內(nèi)存房待,那么怎么判斷什么值不再使用呢,一般來說,當一個函數(shù)執(zhí)行完畢吴攒,那么這個局部作用域內(nèi)的變量就沒有存在的必要了张抄,它的內(nèi)存空間就會釋放,但是有一種情況可以阻止這一進程洼怔,那就是——閉包署惯。

javascript代碼執(zhí)行過程


這個流程圖是javascript代碼執(zhí)行要經(jīng)歷的一個完整過程,其中我標出了作用域镣隶,執(zhí)行上下文极谊,作用域鏈,即使你現(xiàn)在還不明白這個流程圖的每個部分都是做什么的安岂,但是你現(xiàn)在至少應(yīng)該明白這三者是完全不一樣的概念轻猖。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市域那,隨后出現(xiàn)的幾起案子咙边,更是在濱河造成了極大的恐慌膀估,老刑警劉巖揭措,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異砰嘁,居然都是意外死亡淑蔚,警方通過查閱死者的電腦和手機市殷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刹衫,“玉大人醋寝,你說我怎么就攤上這事〈伲” “怎么了音羞?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長仓犬。 經(jīng)常有香客問我黄选,道長,這世上最難降的妖魔是什么婶肩? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮貌夕,結(jié)果婚禮上律歼,老公的妹妹穿的比我還像新娘。我一直安慰自己啡专,他們只是感情好险毁,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般畔况。 火紅的嫁衣襯著肌膚如雪鲸鹦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天跷跪,我揣著相機與錄音馋嗜,去河邊找鬼。 笑死吵瞻,一個胖子當著我的面吹牛葛菇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播橡羞,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼眯停,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了卿泽?” 一聲冷哼從身側(cè)響起莺债,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎签夭,沒想到半個月后齐邦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡覆致,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年侄旬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片煌妈。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡儡羔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出璧诵,到底是詐尸還是另有隱情汰蜘,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布之宿,位于F島的核電站族操,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏比被。R本人自食惡果不足惜色难,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望等缀。 院中可真熱鬧枷莉,春花似錦、人聲如沸尺迂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蹲盘,卻和暖如春股毫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背召衔。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工铃诬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人薄嫡。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓氧急,卻偏偏與公主長得像,于是被迫代替她去往敵國和親毫深。 傳聞我的和親對象是個殘疾皇子吩坝,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

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