欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

内存泄漏

程序员文章站 2022-04-19 07:56:35
...

 

1.全局变量引起的内存泄露

function foo() {
	name = 123;  // name成为一个全局变量,不会被回收
    // 相当于 window.name = 123;
}

function bar() {
	this.age = 34; // 相当于window.age = 34;
}
bar();

2.闭包引起的内存泄露
var foo = (function() {
	var age= 25; // 被闭包引用,不会被回收
    return function() {
    	console.log(score);
    }
})();

3.DOM被删除或者被清空时,时间未清除导致的内存泄漏
$('#foo').on('click', function() {
	console.log(1);
}).remove();

// 解决方法
$('#foo').on('click', function() {
	console.log(1);
}).off('click').remove();

// 原始解法
var foo = document.getElementById('foo');
foo.onclick = function() {
	console.log(1);
    foo.onclick = null;
}

// 采用事件委托
document.onclick = function(event) {
	event = event || window.event;
    if(event.target.id == 'foo') {
    	console.log(1);
    }
}

4.被遗忘的计时器或者回调函数
var someResource = getData();
setInterval(function() {
    var node = document.getElementById('Node');
    if(node) {
        // Do stuff with node and someResource.
        node.innerHTML = JSON.stringify(someResource));
    }
}, 1000);
计时器使得节点或数据的引用不再被需要了。如果间隔处理不能被回收,它的依赖也不能被回收。那意味着可能存储着大量数据的someResource,也不能被回收。