中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

javascript內存泄漏有哪些原因

發布時間:2021-11-20 17:27:54 來源:億速云 閱讀:166 作者:iii 欄目:web開發

本篇內容介紹了“javascript內存泄漏有哪些原因”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

javascript內存泄漏的原因:1、全局變量使用不當;2、閉包使用不當;3、延時器或定時器沒有被清除;4、沒有清理的DOM元素引用(dom清空或刪除時,事件未清除)。

本教程操作環境:windows7系統、javascript1.8.5版、Dell G3電腦。

內存泄露是指一塊被分配的內存既不能使用,又不能回收,直到瀏覽器進程結束。即指由于疏忽或錯誤造成程序未能釋放已經不再使用的內存。 內存泄漏并非指內存在物理上的消失,而是應用程序分配某段內存后,由于設計錯誤,導致在釋放該段內存之前就失去了對該段內存的控制,從而造成了內存的浪費。這里就講一些常見會帶來內存泄露的原因。

1. 全局變量

JavaScript可以處理沒有聲明的變量:一個未聲明的變量的引用在全局對象中創建了一個新變量。在瀏覽器的環境中,全局對象是window。

function foo(){
  name = '前端曰';
}
// 其實是把name變量掛載在window對象上
function foo(){
  window.name = '前端曰';
}

// 又或者
function foo(){
  this.name = '前端曰';
}
foo() // 其實這里的this就是指向的window對象

這樣無意中一個意外的全局變量就被創建了,為了阻止這種錯誤發生,在你的Javascript文件最前面添加 ‘use strict;’ 。這開啟了解析JavaScript的阻止意外全局的更嚴格的模式。或者自己注意好變量的定義!

2. 閉包

閉包:匿名函數可以訪問父級作用域的變量。

var names = (function(){  
    var name = 'js-say';
    return function(){
        console.log(name);
    }
})()

閉包會造成對象引用的生命周期脫離當前函數的上下文,如果閉包使用不當,可以導致環形引用(circular reference),類似于死鎖,只能避免,無法發生之后解決,即使有垃圾回收也還是會內存泄露。

3. 被遺忘的延時器/定時器

在我們的日常需求中,可能會經常試用到 setInterval/setTimeout ,但是使用完之后通常忘記清理。

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

setInterval/setTimeout 中的 this 指向的是window對象,所以內部定義的變量也掛載到了全局;if 內引用了 someResource 變量,如果沒有清除 setInterval/setTimeout 的話someResource 也得不到釋放;同理其實 setTimeout 也一樣。所以我們用完需要記得去 clearInterval/clearTimeout。

4、沒有清理的DOM元素引用(dom清空或刪除時,事件未清除)

var elements = {
    button: document.getElementById('button'),
    image: document.getElementById('image'),
    text: document.getElementById('text')
};
function doStuff() {
    image.src = 'http://some.url/image';
    button.click();
    console.log(text.innerHTML);
}
function removeButton() {
    document.body.removeChild(document.getElementById('button'));
    // 此時,仍舊存在一個全局的 #button 的引用
    // elements 字典。button 元素仍舊在內存中,不能被 GC 回收。
}

“javascript內存泄漏有哪些原因”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

临武县| 中阳县| 白朗县| 铁岭市| 万宁市| 宿迁市| 上虞市| 宁都县| 和田县| 屯昌县| 介休市| 仁寿县| 南岸区| 交城县| 上栗县| 图木舒克市| 南丰县| 镇沅| 桂平市| 南平市| 三台县| 大方县| 遂昌县| 吉林省| 新蔡县| 曲周县| 大安市| 湖北省| 建水县| 德阳市| 顺义区| 林甸县| 尤溪县| 裕民县| 平邑县| 惠州市| 杭州市| 北流市| 霍邱县| 沙湾县| 蓬莱市|