国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

復(fù)習(xí)Javascript專題(二):閉包,內(nèi)存,以及垃圾回收機(jī)制

hankkin / 1892人閱讀

摘要:一個(gè)閉包就是當(dāng)一個(gè)函數(shù)返回時(shí),一個(gè)沒(méi)有釋放資源的棧區(qū)所以參數(shù)和變量不會(huì)被垃圾回收機(jī)制回收。使用不當(dāng)會(huì)很容易造成內(nèi)存泄露。最后,垃圾回收器完成內(nèi)存清除工作,銷毀那些帶標(biāo)記的值并回收它們所占用的內(nèi)存空間。

1.什么是閉包?閉包有啥特性以及存在什么問(wèn)題?
概念:閉包是指有權(quán)訪問(wèn)另一個(gè)函數(shù)作用域中的變量的函數(shù)。下面的outer就形成了一個(gè)閉包:
function outer(){
    const name="nagi";
    return function inner(){
        console.log(name);
    }
 }
let p=outer();
}
let p=outer();

一般來(lái)講,當(dāng)函數(shù)執(zhí)行完畢后,局部活動(dòng)對(duì)象就會(huì)被銷毀,內(nèi)存中僅保存全局執(zhí)行環(huán)境中的變量對(duì)象,但閉包有所不同。
當(dāng)outer()執(zhí)行完后,因?yàn)閕nner函數(shù)的作用域鏈在引用outer的活動(dòng)對(duì)象,所以它并不會(huì)被銷毀,而是仍然留在內(nèi)存中,
除非inner函數(shù)也銷毀它的活動(dòng)對(duì)象才會(huì)被銷毀。比如使p=null;

特性: 由上面的代碼可以得出以下幾個(gè)特性:

a. 函數(shù)嵌套函數(shù),作為一個(gè)函數(shù)變量的一個(gè)引用,當(dāng)函數(shù)返回時(shí),其處于激活狀態(tài)。
b. 函數(shù)內(nèi)部可以引用外部的參數(shù)和變量。
c. 一個(gè)閉包就是當(dāng)一個(gè)函數(shù)返回時(shí),一個(gè)沒(méi)有釋放資源的棧區(qū),所以參數(shù)和變量不會(huì)被垃圾回收機(jī)制回收。

優(yōu)點(diǎn):

 a. 減少全局變量的污染
 b. 可以有私有變量的存在
function counter(){
    let n=0;
    function add(){
        n++;
       console.log(n);
    }
    return {n:n, add:add}
}
const c1=counter();
const c2=counter(); // 它和c1分別存入了不同的堆內(nèi)存中
c1.add(); // 1
c1.add(); // 2
c1.n;     // 0 // 此處的n是基本類型,除非重新賦值,否則不會(huì)變!
c2.add(); // 1 c1和c2互不干涉,都有自己的新的作用域鏈和新的私有變量
注意!!父函數(shù)每次調(diào)用會(huì)產(chǎn)生新的閉包

缺點(diǎn)(問(wèn)題)

a.常駐內(nèi)存,增加內(nèi)存使用量。
b. 使用不當(dāng)會(huì)很容易造成內(nèi)存泄露。
另:閉包的多種寫法可以參照這里:JavaScript閉包(closure)
2.js中的垃圾回收機(jī)制
 原理:js中有自動(dòng)回收管理內(nèi)存機(jī)制,它的原理是會(huì)定期(周期性地)找出那些不再繼續(xù)使用的變量,然后釋放其占用的內(nèi)存。

內(nèi)存管理:

1. 分配內(nèi)存(不管是基本類型還是引用類型)
2. 使用內(nèi)存(對(duì)變量,函數(shù)等讀取或?qū)懖僮鳎?3. 釋放內(nèi)存(使用垃圾回收機(jī)制回收內(nèi)存)
回收方式 1.引用計(jì)數(shù)
**含義:**跟蹤記錄每個(gè)值被引用的次數(shù)。
**工作機(jī)制:**
    當(dāng)聲明一個(gè)變量并將一個(gè)引用類型值賦給它時(shí),則這個(gè)值的引用次數(shù)就是1;
    如果同一個(gè)值又被賦給另一個(gè)變量,則該值的引用次數(shù)加1;
    相反,如果包含對(duì)這個(gè)值引用的變量又被賦了其他值,則這個(gè)值的引用次數(shù)減1;
    當(dāng)這個(gè)值的引用次數(shù)為0時(shí),則說(shuō)明沒(méi)有辦法再訪問(wèn)這個(gè)值了;
    這樣,當(dāng)垃圾收集器下次再運(yùn)行時(shí),便會(huì)釋放這種引用次數(shù)為0的值所占的內(nèi)存。

問(wèn)題:

這種方式有一個(gè)嚴(yán)重的問(wèn)題,即“循環(huán)引用”。
意思是對(duì)象A中包含一個(gè)指向?qū)ο驜的指針,而對(duì)象B也包含一個(gè)指向?qū)ο驛的指針,
這樣當(dāng)函數(shù)執(zhí)行完畢后,因?yàn)槠湟靡簿陀肋h(yuǎn)不會(huì)為0,所以對(duì)象A和B將繼續(xù)存在,
如果對(duì)象所在函數(shù)被重復(fù)調(diào)用,就會(huì)導(dǎo)致大量?jī)?nèi)存得不到回收。
 function problem(){
     let objA=new Object();
     let objB=new Object();

     objA.someOtherObj=objB;
     objB.antherObj=objA;
 }
2.標(biāo)記清除(常用方式)
原理:垃圾回收器會(huì)在運(yùn)行時(shí)給存儲(chǔ)在內(nèi)存中的所有變量加一個(gè)標(biāo)記。
(當(dāng)變量進(jìn)入環(huán)境時(shí),就交這個(gè)變量標(biāo)記為“進(jìn)入環(huán)境”。而當(dāng)變量離開環(huán)境時(shí),則將其標(biāo)記為“離開環(huán)境”。)

然后,它會(huì)去掉環(huán)境中的變量以及被環(huán)境中的變量引用的變量的標(biāo)記(閉包)。

而在這些完成之后再被加上標(biāo)記的變量將被視為準(zhǔn)備刪除的變量,原因是環(huán)境中的變量已經(jīng)無(wú)法訪問(wèn)到這些變量了。

最后,垃圾回收器完成內(nèi)存清除工作,銷毀那些帶標(biāo)記的值并回收它們所占用的內(nèi)存空間。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/108822.html

相關(guān)文章

  • JS專題垃圾回收

    摘要:如果沒(méi)有引用指向該對(duì)象零引用,對(duì)象將被垃圾回收機(jī)制回收。經(jīng)過(guò)增量標(biāo)記改進(jìn)后,垃圾回收的最大停頓時(shí)間可以減少到原來(lái)的左右。解除引用的真正作用是讓值脫離執(zhí)行環(huán)境,以便垃圾收集器下次運(yùn)行時(shí)將其回收。 前言 在講 JS 的垃圾回收(Garbage Collection)之前,我們回顧上一篇《JS專題之memoization》,memoization 的原理是以參數(shù)作為 key,函數(shù)結(jié)果作為 v...

    liujs 評(píng)論0 收藏0
  • 【重溫基礎(chǔ)】19.閉包

    摘要:系列目錄復(fù)習(xí)資料資料整理個(gè)人整理重溫基礎(chǔ)篇重溫基礎(chǔ)對(duì)象介紹重溫基礎(chǔ)對(duì)象介紹重溫基礎(chǔ)介紹重溫基礎(chǔ)相等性判斷本章節(jié)復(fù)習(xí)的是中的關(guān)于閉包,這個(gè)小哥哥呀,看看。這里隨著閉包函數(shù)的結(jié)束,執(zhí)行環(huán)境銷毀,變量回收。 本文是 重溫基礎(chǔ) 系列文章的第十九篇。今日感受:將混亂的事情找出之間的聯(lián)系,也是種能力。 系列目錄: 【復(fù)習(xí)資料】ES6/ES7/ES8/ES9資料整理(個(gè)人整理) 【重溫基礎(chǔ)】...

    nanfeiyan 評(píng)論0 收藏0
  • 【重溫基礎(chǔ)】22.內(nèi)存管理

    摘要:內(nèi)存泄露內(nèi)存泄露概念在計(jì)算機(jī)科學(xué)中,內(nèi)存泄漏指由于疏忽或錯(cuò)誤造成程序未能釋放已經(jīng)不再使用的內(nèi)存。判斷內(nèi)存泄漏,以字段為準(zhǔn)。 本文是 重溫基礎(chǔ) 系列文章的第二十二篇。 今日感受:優(yōu)化學(xué)習(xí)方法。 系列目錄: 【復(fù)習(xí)資料】ES6/ES7/ES8/ES9資料整理(個(gè)人整理) 【重溫基礎(chǔ)】1-14篇 【重溫基礎(chǔ)】15.JS對(duì)象介紹 【重溫基礎(chǔ)】16.JSON對(duì)象介紹 【重溫基礎(chǔ)】1...

    Pandaaa 評(píng)論0 收藏0
  • 56 道高頻 JavaScript 與 ES6+ 的面試題及答案

    摘要:線程的劃分尺度小于進(jìn)程,使得多線程程序的并發(fā)性高。線程在執(zhí)行過(guò)程中與進(jìn)程還是有區(qū)別的。每個(gè)獨(dú)立的線程有一個(gè)程序運(yùn)行的入口順序執(zhí)行序列和程序的出口。從邏輯角度來(lái)看,多線程的意義在于一個(gè)應(yīng)用程序中,有多個(gè)執(zhí)行部分可以同時(shí)執(zhí)行。 showImg(https://segmentfault.com/img/bVbv2GE?w=900&h=400); 前言 本文講解 56 道 JavaScript...

    zengdongbao 評(píng)論0 收藏0
  • 溫故js系列(14)-閉包&垃圾回收&內(nèi)存泄露&閉包應(yīng)用&作用域鏈&

    摘要:該對(duì)象包含了函數(shù)的所有局部變量命名參數(shù)參數(shù)集合以及,然后此對(duì)象會(huì)被推入作用域鏈的前端。如果整個(gè)作用域鏈上都無(wú)法找到,則返回。此時(shí)的作用域鏈包含了兩個(gè)對(duì)象的活動(dòng)對(duì)象和對(duì)象。 前端學(xué)習(xí):教程&開發(fā)模塊化/規(guī)范化/工程化/優(yōu)化&工具/調(diào)試&值得關(guān)注的博客/Git&面試-前端資源匯總 歡迎提issues斧正:閉包 JavaScript-閉包 閉包(closure)是一個(gè)讓人又愛又恨的somet...

    Amio 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

hankkin

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<