欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

JavaScript中內(nèi)存泄漏指的是什么

小編給大家分享一下JavaScript中內(nèi)存泄漏指的是什么,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),延慶企業(yè)網(wǎng)站建設(shè),延慶品牌網(wǎng)站建設(shè),網(wǎng)站定制,延慶網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,延慶網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。

內(nèi)存泄漏指的是當(dāng)一個對象不起作用時應(yīng)該被回收時卻因為另一個對象對它的引用而導(dǎo)致它不能被回收,留在了堆內(nèi)存中就稱為內(nèi)存泄漏。常見的有意外全局變量,DOM泄漏以及循環(huán)引用等

JavaScript中內(nèi)存泄漏指的是什么

內(nèi)存泄漏

內(nèi)存泄漏一般指的是當(dāng)一個對象已經(jīng)沒有作用了應(yīng)該被回收時,另外一個正在使用的對象因?qū)λ囊脧亩鴮?dǎo)致它不能被回收,這個不能被回收的對象停留在了堆內(nèi)存中,這就造成了內(nèi)存泄漏

當(dāng)一個對象已經(jīng)不需要再使用本該被回收時,另外一個正在使用的對象持有它的引用從而導(dǎo)致它不能被回收,這導(dǎo)致本該被回收的對象不能被回收而停留在堆內(nèi)存中,這就產(chǎn)生了內(nèi)存泄漏

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

1、意外的全局變量

Js處理未定義變量的方式:未定義的變量會在全局對象創(chuàng)建一個新變量,在瀏覽器中,全局對象是window。

function foo(arg) { 
bar = "this is a hidden global variable"; //等同于window.bar="this is a hidden global variable"
this.bar2= "potential accidental global";//這里的this 指向了全局對象(window),
等同于window.bar2="potential accidental global"}

解決方法:在JavaScript程序中添加,開啟嚴(yán)格模式'use strict',可以有效地避免上述問題。

注意:用來臨時存儲大量數(shù)據(jù)的全局變量,在確保處理完這些數(shù)據(jù)后要將其設(shè)置為null或者重新賦值。

2、DOM泄漏

在瀏覽器中DOM和JS所采用的引擎是不一樣的,DOM采用的是渲染引擎,而JS采用的是v8引擎,所以在用JS操作DOM時會比較耗費性能,所以為了減少DOM的操作,我們會采用變量引用的方式會將其緩存在當(dāng)前環(huán)境。如果在進行一些刪除、更新操作之后,可能會忘記釋放已經(jīng)緩存的DOM因此造成了內(nèi)存泄漏

例:對沒有清理的DOM元素引用

var refA = document.getElementById('refA');
document.body.removeChild(refA); // #refA不能回收,因為存在變量refA對它的引用。
將其對#refA引用釋放,但還是無法回收#refA。

解決辦法:設(shè)置refA = null;

3、被遺忘的計時器和回調(diào)函數(shù)

var someResource = getData();
setInterval(function() {
    var node = document.getElementById('Node');
    if(node) {
        node.innerHTML = JSON.stringify(someResource));
    }
}, 1000);

這樣的代碼很常見, 如果id為Node的元素從DOM中移除, 該定時器仍會存在, 同時, 因為回調(diào)函數(shù)中包含對someResource的引用, 定時器外面的someResource也不會被釋放

4、循環(huán)引用

在js的內(nèi)存管理環(huán)境中,如果對象 A 對B有訪問對象的權(quán)限,就稱為對象 A 引用對象 B。引用的計數(shù)的策略就是看對象有沒有其他對象引用到它,如果沒有對象引用這個對象,那么這個對象將會被回收 。

var obj1 = { a: 1 }; // 一個對象(稱之為 A)被創(chuàng)建,賦值給 obj1,A 的引用個數(shù)為 1  
var obj2 = obj1; // A 的引用個數(shù)變?yōu)?2  
 obj1 = 0; // A 的引用個數(shù)變?yōu)?1 
 obj2 = 0; // A 的引用個數(shù)變?yōu)?0,此時對象 A 就可以被垃圾回收了

但是引用計數(shù)有個最大的問題就是循環(huán)引用。

function func() {  
    var obj1 = {};  
    var obj2 = {};  
    obj1.a = obj2; // obj1 引用 obj2  
    obj2.a = obj1; // obj2 引用 obj1  }

當(dāng)函數(shù)執(zhí)行結(jié)束后,返回值為 undefined,所以整個函數(shù)以及內(nèi)部的變量都應(yīng)該被回收,但根據(jù)引用計數(shù)方法,obj1 和 obj2 的引用次數(shù)都不為 0,所以他們不會被回收。所以要解決這個問題可以設(shè)置它們的值為null

看完了這篇文章,相信你對JavaScript中內(nèi)存泄漏指的是什么有了一定的了解,想了解更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

當(dāng)前題目:JavaScript中內(nèi)存泄漏指的是什么
文章地址:http://www.chinadenli.net/article32/gcigpc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊網(wǎng)站設(shè)計搜索引擎優(yōu)化網(wǎng)站收錄網(wǎng)站策劃外貿(mào)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)