欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JS造成內(nèi)存泄漏的幾種情況實例分析

 更新時間:2020年03月02日 11:54:22   作者:葉落森  
這篇文章主要介紹了JS造成內(nèi)存泄漏的幾種情況,結(jié)合實例形式分析了內(nèi)存泄漏的原理以及JS造成內(nèi)存泄漏的幾種常見情況,需要的朋友可以參考下

本文實例講述了JS造成內(nèi)存泄漏的幾種情況。分享給大家供大家參考,具體如下:

介紹:

js中的內(nèi)存垃圾回收機制:垃圾回收器會定期掃描內(nèi)存,當某個內(nèi)存中的值被引用為零時就會將其回收。當前變量已經(jīng)使用完畢但依然被引用,導致垃圾回收器無法回收這就造成了內(nèi)存泄漏。傳統(tǒng)頁面每次跳轉(zhuǎn)都會釋放內(nèi)存,所以并不是特別明顯。

Vue單頁面應用中:Web App 與 傳統(tǒng)Web的區(qū)別,因為Web App是單頁面應用頁面通過路由跳轉(zhuǎn)不會刷新頁面,導致內(nèi)存泄漏不斷堆積,導致頁面卡頓。

泄漏點:

1.DOM/BOM 對象泄漏
2.script 中存在對DOM/BOM 對象的引用導致
3.Javascript 對象泄漏
4.通常由閉包導致,比如事件處理回調(diào),導致DOM對象和腳本中對象雙向引用,這個時常見的泄漏原因

代碼關(guān)注點:

1.DOM中的addEventLisner 函數(shù)及派生的事件監(jiān)聽, 比如Jquery 中的on 函數(shù), vue 組件實例的 $on 函數(shù),第三方庫中的初始化函數(shù)
2.其它BOM對象的事件監(jiān)聽, 比如websocket 實例的on 函數(shù)
3.避免不必要的函數(shù)引用
4.如果使用render 函數(shù),避免在html標簽中綁定DOM/BOM 事件

Vue如何處理:

1.如果在mounted/created 鉤子中綁定了DOM/BOM 對象中的事件,需要在beforeDestroy 中做對應解綁處理
2.如果在mounted/created 鉤子中使用了第三方庫初始化,需要在beforeDestroy 中做對應銷毀處理
3.如果組件中使用了定時器,需要在beforeDestroy 中做對應銷毀處理
4.模板中不要使用表達式來綁定到特定的處理函數(shù),這個邏輯應該放在處理函數(shù)中?
5.如果在mounted/created 鉤子中使用了$on,需要在beforeDestroy 中做對應解綁($off)處理
6.某些組件在模板中使用 事件綁定可能會出現(xiàn)泄漏,使用$on 替換模板中的綁定

Vue官網(wǎng)講解避免內(nèi)存泄露https://cn.vuejs.org/v2/cookbook/avoiding-memory-leaks.html

另外,vue  在IE edge瀏覽器下,父子組件的場景,子組件依賴父組件的狀態(tài),子組件控制父組件狀態(tài)變化從而反饋給子組件的展示變化,子組件通過v-if模式存在于視圖中,父組件通過狀態(tài)控制子組件的v-if狀態(tài)變換。子組件控制父組件狀態(tài)完成子組件數(shù)據(jù)填充后,父組件切換子組件的v-if狀態(tài),子組件占用dom結(jié)構(gòu)被清理。此時,子組件存在時的內(nèi)存占用未被釋放,當父組件再次回切v-if狀態(tài)時,子組件重新展示,內(nèi)存飆升,重復幾次切換后,內(nèi)存飆升明顯,頁面卡頓。

js通常內(nèi)存泄漏的幾種情況的介紹

1.閉包

function fn1(){
  var n=1;
}
//我想取到里面的局部變量n
function fn1(){
  var n=1;
  function fn2(){//在加一個fn2當他的子集
    alert(n);
  }
 
}

但是我在外面還是訪問不到那就return出來 

function fn1(){
  var n=1;
  function fn2(){//在加一個fn2當他的子集
    alert(n);
  }
return fn2(); 
//return出來后 他就給 window了所以一直存在內(nèi)存中。因為一直在內(nèi)存中,在IE里容易造成內(nèi)存泄漏
}
fn1();

盡量書寫的時候,避免這種情況。 

2.意外的全局變量 

一個未聲明變量的引用會在全局對象中創(chuàng)建一個新的變量。在瀏覽器的環(huán)境下,全局對象就是 window,也就是說:

function foo(arg) {
  bar = "aaaaa";
}
 
實際上等價于
function foo(arg) {
  window.bar = "aaaaa";
}
function foo() {
  this.variable = "qqqqq";
}
//this 指向全局對象(window)
foo();

 為了防止這種錯誤的發(fā)生,可以在你的 JavaScript 文件開頭添加 'use strict'; 語句

3.定時器setTimeout setInterval

當不需要setInterval或者setTimeout時,定時器沒有被clear,定時器的回調(diào)函數(shù)以及內(nèi)部依賴的變量都不能被回收,造成內(nèi)存泄漏。比如:vue使用了定時器,需要在beforeDestroy 中做對應銷毀處理。js也是一樣的。

clearTimeout(***)
clearInterval(***)

4.如果在mounted/created 鉤子中使用了$on,需要在beforeDestroy 中做對應解綁($off)處理

beforeDestroy() {
 this.bus.$off('****');
}

5、給DOM對象添加的屬性是一個對象的引用

var testObject = {}; 
document.getElementById('idname').property = testObject; //如果DOM不被消除,則testObject會一直存在,造成內(nèi)存泄漏

解決方法:

在window.onunload事件中寫上:

window.onunload=function(){
  document.getElementById('idname').property = null;     //釋放內(nèi)存
};

6.DOM對象與JS對象相互引用

function testObject(element) { 
this.elementReference = element;   // 為testObject(js)對象的屬性綁定element(DOM)對象
element.property = this;    // 為element(DOM)對象的屬性綁定testObject(js)對象
} 
new testObject(document.getElementById('idname'));

解決方法:

在window.onunload事件中寫上:

document.getElementById('idname').property = null;

7.從外到內(nèi)執(zhí)行appendChild。這時即使調(diào)用removeChild也無法釋放

var parentDiv = document.createElement("div"); 
var childDiv = document.createElement("div"); 
document.body.appendChild(parentDiv); 
parentDiv.appendChild(childDiv); 

解決方法: 
從內(nèi)到外執(zhí)行appendChild: 

var parentDiv = document.createElement("div"); 
var childDiv = document.createElement("div"); 
parentDiv.appendChild(childDiv); 
document.body.appendChild(parentDiv); 

8.反復重寫同一個屬性會造成內(nèi)存大量占用(但關(guān)閉IE后內(nèi)存會被釋放)

for(i = 0; i < 5000; i++) { 
  hostElement.text = "asdfasdfasdf"; 
} 

這種方式相當于定義了5000個屬性! 

9.注意程序邏輯,避免“死循環(huán)”之類的

10.echarts配合循環(huán)計時器等出現(xiàn)的內(nèi)存泄漏

感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運行工具http://tools.jb51.net/code/HtmlJsRun測試上述代碼運行效果。

更多關(guān)于JavaScript相關(guān)內(nèi)容可查看本站專題:《JavaScript操作DOM技巧總結(jié)》、《JavaScript頁面元素操作技巧總結(jié)》、《JavaScript事件相關(guān)操作與技巧大全》、《JavaScript查找算法技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript錯誤與調(diào)試技巧總結(jié)

希望本文所述對大家JavaScript程序設(shè)計有所幫助。

相關(guān)文章

  • 基于JavaScript實現(xiàn)圖片放大鏡功能

    基于JavaScript實現(xiàn)圖片放大鏡功能

    在一些電商網(wǎng)站上,經(jīng)??吹接猩唐穲D片被放大查看的功能,所以本文將使用前端技術(shù)實現(xiàn)一個簡單的圖片放大鏡功能,希望能給大家?guī)硪欢ǖ膸椭?/div> 2023-06-06
  • JavaScript測試工具之Karma-Jasmine的安裝和使用詳解

    JavaScript測試工具之Karma-Jasmine的安裝和使用詳解

    Jasmine是一個Javascript的測試工具,在Karma上運行Jasmine可完成Javascript的自動化測試、生成覆蓋率報告等。本文不包含Jasmine的使用細節(jié),這幾天我會寫一篇Jasmine的入門文章,有興趣的朋友到時候可以看一下
    2015-12-12
  • js實現(xiàn)淘寶固定側(cè)邊欄

    js實現(xiàn)淘寶固定側(cè)邊欄

    這篇文章主要為大家詳細介紹了js實現(xiàn)淘寶固定側(cè)邊欄,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • JavaScript事件委托原理與用法實例分析

    JavaScript事件委托原理與用法實例分析

    這篇文章主要介紹了JavaScript事件委托原理與用法,結(jié)合實例形式較為詳細的分析了JavaScript事件流以及事件委托相關(guān)原理、用法與操作注意事項,需要的朋友可以參考下
    2018-06-06
  • JavaScript讀取本地文件常用方法流程解析

    JavaScript讀取本地文件常用方法流程解析

    這篇文章主要介紹了JavaScript讀取本地文件常用方法流程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • jQuery javascript獲得網(wǎng)頁的高度與寬度的實現(xiàn)代碼

    jQuery javascript獲得網(wǎng)頁的高度與寬度的實現(xiàn)代碼

    下面小編就為大家?guī)硪黄猨Query javascript獲得網(wǎng)頁的高度與寬度的實現(xiàn)代碼。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考
    2016-04-04
  • IE8 chrome中table隔行換色解決辦法

    IE8 chrome中table隔行換色解決辦法

    今天把項目生成好后,發(fā)布到萬維網(wǎng)上進行測試,發(fā)現(xiàn)table的隔行換色在IE8,chorem中不能正常顯示。找了許多資料,CSS看樣是不能解決,只能用JS來控制了
    2010-07-07
  • 使用原生javascript開發(fā)計算器實例代碼

    使用原生javascript開發(fā)計算器實例代碼

    這篇文章主要給大家介紹了關(guān)于如何使用原生javascript開發(fā)計算器的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • 總結(jié)在前端排序中遇到的問題

    總結(jié)在前端排序中遇到的問題

    這篇文章給大家羅列了在前段排序中會遇到的問題并寫了解決方案,非常詳細,有需要的朋友可以參考。
    2016-07-07

最新評論