最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS常見內(nèi)存泄漏及解決方案解析

 更新時(shí)間:2020年05月30日 11:58:23   作者:頡旺飛  
這篇文章主要介紹了JS常見內(nèi)存泄漏及解決方案解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

內(nèi)存泄漏?

官方解釋:內(nèi)存泄漏(Memory Leak)是指程序中己動(dòng)態(tài)分配的堆內(nèi)存由于某種原因程序未釋放或無法釋放,造成系統(tǒng)內(nèi)存的浪費(fèi),導(dǎo)致程序運(yùn)行速度減慢甚至系統(tǒng)崩潰等嚴(yán)重后果。

通俗點(diǎn)就是指由于疏忽或者錯(cuò)誤造成程序未能釋放已經(jīng)不再使用的內(nèi)存,不再用到的內(nèi)存卻沒有及時(shí)釋放,從而造成內(nèi)存上的浪費(fèi)。

避免內(nèi)存泄漏?

在局部作用域中,等函數(shù)執(zhí)行完畢,變量就沒有存在的必要了,垃圾回收機(jī)制很虧地做出判斷并且回收,但是對(duì)于全局變量,很難判斷什么時(shí)候不用這些變量,無法正?;厥眨凰?,盡量少使用全局變量。在使用閉包的時(shí)候,就會(huì)造成嚴(yán)重的內(nèi)存泄漏,因?yàn)殚]包中的局部變量,會(huì)一直保存在內(nèi)存中。

內(nèi)存溢出?

當(dāng)程序運(yùn)行需要的內(nèi)存超過了剩余的內(nèi)存時(shí), 就出拋出內(nèi)存溢出的錯(cuò)誤。
例如下面的代碼,謹(jǐn)慎試用,可能會(huì)卡窗口。。。。

var obj = {}
for (var i = 0; i < 100000; i++) {
obj[i] = new Array(10000000)
}
console.log('------')

常見的js內(nèi)存泄漏

1. 意外的全局變量

在js中,一個(gè)未聲明變量的使用,會(huì)在全局對(duì)象中創(chuàng)建一個(gè)新的變量;在瀏覽器環(huán)境下,全局對(duì)象就是window:

function foo() {
a = 'test'
}
// 上面的寫法等價(jià)于
function foo() {
window.a = 'test'
}
function foo() {
this.a = 'test'
// 函數(shù)自身發(fā)生調(diào)用,this指向全局對(duì)象window
}
foo();

上面的a變量應(yīng)該是foo()內(nèi)部作用域變量的引用,由于沒有使用var來聲明這個(gè)變量,這時(shí)變量a就被創(chuàng)建成了全局變量,這個(gè)就是錯(cuò)誤的,會(huì)導(dǎo)致內(nèi)存泄漏。

解決方式: 在js文件開頭添加 ‘use strict',開啟嚴(yán)格模式。(或者一般將使用過后的全局變量設(shè)置為 null 或者將它重新賦值,這個(gè)會(huì)涉及的緩存的問題,需要注意)

<script> 
"use strict"; 
console.log("這是嚴(yán)格模式。"); 
</script> 
<script> 
 console.log("這是正常模式。"); 
</script>

2. 計(jì)時(shí)器和回調(diào)函數(shù)timers

定時(shí)器setInterval或者setTimeout在不需要使用的時(shí)候,沒有被clear,導(dǎo)致定時(shí)器的回調(diào)函數(shù)及其內(nèi)部依賴的變量都不能被回收,這就會(huì)造成內(nèi)存泄漏。

解決方式:當(dāng)不需要interval或者timeout的時(shí)候,調(diào)用clearInterval或者clearTimeout

3. DOM泄漏

1)給DOM對(duì)象添加的屬性是一個(gè)對(duì)象的引用

var a = {};
document.getElementById('id').diyProp = a;

解決方法:在window.onload時(shí)間中加上 document.getElementById('id').diyProp = null;

2)元素引用沒有清理

var a = document.getElementById('id');
document.body.removeChild(a);
// 不能回收,因?yàn)榇嬖谧兞縜對(duì)它的引用。雖然我們用removeChild移除了,但是還在對(duì)象里保存著#的引用,即DOM元素還在內(nèi)存里面。

解決方法: a = null;

3)事件的綁定沒有移除

解決方法: 移除時(shí)間的監(jiān)聽

4. js閉包

閉包在IE6下會(huì)造成內(nèi)存泄漏,但是現(xiàn)在已經(jīng)無須考慮了。值得注意的是閉包本身不會(huì)造成內(nèi)存泄漏,但閉包過多很容易導(dǎo)致內(nèi)存泄漏。閉包會(huì)造成對(duì)象引用的生命周期脫離當(dāng)前函數(shù)的上下文,如果閉包如果使用不當(dāng),可以導(dǎo)致環(huán)形引用(circular reference),類似于死鎖,只能避免,無法發(fā)生之后解決,即使有垃圾回收也還是會(huì)內(nèi)存泄露。

這個(gè),另外找個(gè)時(shí)間詳細(xì)說明一下,這里就不贅述了

5. console

控制臺(tái)日志記錄對(duì)總體內(nèi)存內(nèi)置文件的影響,也是個(gè)重大的問題,同時(shí)也是容易被忽略的。記錄錯(cuò)誤的對(duì)象,可以將大量的數(shù)據(jù)保留在內(nèi)存中。傳遞給console.log的對(duì)象是不能被垃圾回收,所以沒有去掉console.log可能會(huì)存在內(nèi)存泄漏

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 淺析JavaScript事件和方法

    淺析JavaScript事件和方法

    本文通過示例向大家簡(jiǎn)單分析了javascript的事件和方法,文章簡(jiǎn)潔而不簡(jiǎn)單,是篇非常不錯(cuò)的基礎(chǔ)文章,這里推薦給大家。
    2015-02-02
  • JS實(shí)現(xiàn)CheckBox復(fù)選框全選全不選功能

    JS實(shí)現(xiàn)CheckBox復(fù)選框全選全不選功能

    在網(wǎng)站的管理后臺(tái)應(yīng)用此功能居多,如一次性處理多個(gè)產(chǎn)品,或?qū)ξ恼碌膭h除對(duì)產(chǎn)品的下架等處理,一條一條的點(diǎn)顯然有一些麻煩,如果能每一行放一個(gè)checkbox,然后統(tǒng)一處理就好辦的多了,今天我就用簡(jiǎn)單的篇幅來講解一下這個(gè)功能的實(shí)現(xiàn)原理和實(shí)現(xiàn)過程。
    2015-05-05
  • Javacript實(shí)現(xiàn)顏色梯度變化和漸變的效果代碼

    Javacript實(shí)現(xiàn)顏色梯度變化和漸變的效果代碼

    用js對(duì)導(dǎo)航欄的顏色做了梯度的變化處理,通過處理..獲取兩種顏色在變化時(shí)的各種顏色字符串,并且字符串的個(gè)數(shù),即獲取的頻率可以調(diào)節(jié)
    2013-05-05
  • JS控制HTML元素的顯示和隱藏的兩種方法

    JS控制HTML元素的顯示和隱藏的兩種方法

    本文給大家分享兩種方法來控制html元素的顯示和隱藏,分別利用html的style中兩個(gè)屬性,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧
    2016-09-09
  • 原生js實(shí)現(xiàn)的貪吃蛇網(wǎng)頁版游戲完整實(shí)例

    原生js實(shí)現(xiàn)的貪吃蛇網(wǎng)頁版游戲完整實(shí)例

    這篇文章主要介紹了原生js實(shí)現(xiàn)的貪吃蛇網(wǎng)頁版游戲完整實(shí)例,可實(shí)現(xiàn)自主選擇游戲難度進(jìn)行貪吃蛇游戲的功能,涉及javascript鍵盤事件及頁面元素的操作技巧,需要的朋友可以參考下
    2015-05-05
  • 用js控制電燈開關(guān)

    用js控制電燈開關(guān)

    這篇文章主要為大家詳細(xì)介紹了用js控制電燈開關(guān),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • JavaScript 讀取圖片實(shí)例代碼

    JavaScript 讀取圖片實(shí)例代碼

    本章主要介紹通過JavaScript讀取圖片的例子,本例子不包含服務(wù)器端后臺(tái)代碼,只包含前臺(tái)頁面代碼,所以直接用Html文件就可以,代碼如下,因?yàn)榘敿?xì)的注意,所以不再詳細(xì)說明了,如果有看不明白的,可以給我留言,我給大家具體答復(fù)。
    2009-11-11
  • 最簡(jiǎn)單的JavaScript圖片輪播代碼(兩種方法)

    最簡(jiǎn)單的JavaScript圖片輪播代碼(兩種方法)

    基于javascript代碼實(shí)現(xiàn)最簡(jiǎn)單的圖片輪播效果,非常簡(jiǎn)單,本文通過兩種方式給大家介紹最簡(jiǎn)單的圖片輪播,感興趣的朋友一起學(xué)習(xí)吧
    2015-12-12
  • bootstrapfileinput實(shí)現(xiàn)文件自動(dòng)上傳

    bootstrapfileinput實(shí)現(xiàn)文件自動(dòng)上傳

    這篇文章主要介紹了bootstrapfileinput實(shí)現(xiàn)文件自動(dòng)上傳,bootstrap fileinput插件對(duì)多種類型的文件提供文件預(yù)覽,并且提供了多選等功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • javascript 獲取頁面的高度及滾動(dòng)條的位置的代碼

    javascript 獲取頁面的高度及滾動(dòng)條的位置的代碼

    javascript獲取頁面的高度及滾動(dòng)條的位置的代碼,需要的朋友可以參考下。
    2010-05-05

最新評(píng)論

贵定县| 定陶县| 仁化县| 托克逊县| 信丰县| 永清县| 辛集市| 宝丰县| 云和县| 商城县| 屯门区| 双鸭山市| 北海市| 锡林浩特市| 谷城县| 卢湾区| 兖州市| 黄骅市| 治多县| 镇巴县| 彭州市| 元朗区| 运城市| 双辽市| 海兴县| 宝鸡市| 花莲市| 梓潼县| 静乐县| 澄迈县| 临清市| 灌阳县| 太和县| 乌海市| 平安县| 甘肃省| 常德市| 肥乡县| 务川| 金塔县| 万年县|