亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

西贡区| 西乌| 仙游县| 金阳县| 西平县| 车致| 泸水县| 富锦市| 定西市| 磐安县| 榆林市| 财经| 兴化市| 福鼎市| 桃江县| 九龙县| 怀安县| 阿拉善左旗| 平江县| 平远县| 淮阳县| 驻马店市| 普洱| 威信县| 桂阳县| 仙居县| 葵青区| 炎陵县| 乌恰县| 利津县| 佛学| 庆云县| 阳城县| 宜春市| 筠连县| 镇江市| 云浮市| 元朗区| 高邑县| 通榆县| 墨玉县|