日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

复习Javascript专题(二):闭包,内存,以及垃圾回收机制

發(fā)布時間:2025/3/20 java 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 复习Javascript专题(二):闭包,内存,以及垃圾回收机制 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.什么是閉包?閉包有啥特性以及存在什么問題?

概念:閉包是指有權(quán)訪問另一個函數(shù)作用域中的變量的函數(shù)。下面的outer就形成了一個閉包: function outer(){const name='nagi';return function inner(){console.log(name);}} let p=outer(); } let p=outer();

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

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

a. 函數(shù)嵌套函數(shù),作為一個函數(shù)變量的一個引用,當(dāng)函數(shù)返回時,其處于激活狀態(tài)。 b. 函數(shù)內(nèi)部可以引用外部的參數(shù)和變量。 c. 一個閉包就是當(dāng)一個函數(shù)返回時,一個沒有釋放資源的棧區(qū),所以參數(shù)和變量不會被垃圾回收機(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是基本類型,除非重新賦值,否則不會變! c2.add(); // 1 c1和c2互不干涉,都有自己的新的作用域鏈和新的私有變量 注意!!父函數(shù)每次調(diào)用會產(chǎn)生新的閉包

缺點(diǎn)(問題)

a.常駐內(nèi)存,增加內(nèi)存使用量。 b. 使用不當(dāng)會很容易造成內(nèi)存泄露。 另:閉包的多種寫法可以參照這里:JavaScript閉包(closure)

2.js中的垃圾回收機(jī)制

原理:js中有自動回收管理內(nèi)存機(jī)制,它的原理是會定期(周期性地)找出那些不再繼續(xù)使用的變量,然后釋放其占用的內(nèi)存。

內(nèi)存管理:

1. 分配內(nèi)存(不管是基本類型還是引用類型) 2. 使用內(nèi)存(對變量,函數(shù)等讀取或?qū)懖僮?#xff09; 3. 釋放內(nèi)存(使用垃圾回收機(jī)制回收內(nèi)存)

回收方式

1.引用計數(shù)

**含義:**跟蹤記錄每個值被引用的次數(shù)。 **工作機(jī)制:**當(dāng)聲明一個變量并將一個引用類型值賦給它時,則這個值的引用次數(shù)就是1;如果同一個值又被賦給另一個變量,則該值的引用次數(shù)加1;相反,如果包含對這個值引用的變量又被賦了其他值,則這個值的引用次數(shù)減1;當(dāng)這個值的引用次數(shù)為0時,則說明沒有辦法再訪問這個值了;這樣,當(dāng)垃圾收集器下次再運(yùn)行時,便會釋放這種引用次數(shù)為0的值所占的內(nèi)存。

問題:

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

2.標(biāo)記清除(常用方式)

原理:垃圾回收器會在運(yùn)行時給存儲在內(nèi)存中的所有變量加一個標(biāo)記。 (當(dāng)變量進(jìn)入環(huán)境時,就交這個變量標(biāo)記為“進(jìn)入環(huán)境”。而當(dāng)變量離開環(huán)境時,則將其標(biāo)記為“離開環(huán)境”。)然后,它會去掉環(huán)境中的變量以及被環(huán)境中的變量引用的變量的標(biāo)記(閉包)。而在這些完成之后再被加上標(biāo)記的變量將被視為準(zhǔn)備刪除的變量,原因是環(huán)境中的變量已經(jīng)無法訪問到這些變量了。最后,垃圾回收器完成內(nèi)存清除工作,銷毀那些帶標(biāo)記的值并回收它們所占用的內(nèi)存空間。

總結(jié)

以上是生活随笔為你收集整理的复习Javascript专题(二):闭包,内存,以及垃圾回收机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。