js内存泄漏详解
来源:互联网 发布:冯文乐网络春晚 编辑:程序博客网 时间:2024/06/07 02:33
JavaScript常见内存泄漏原因及其解决方式
内存泄漏的定义
本质上来说,即是那些无法被应用所使用但又没有被浏览器回收的内存。
JavaScript中的内存管理机制
首先,JS是支持GC语言的,这类语言可以帮助程序猿们自动的管理内存,并且可以定期去检查内存的分配情况。
在js中,无效的引用代码中本应释放的已经引用的内存却没有释放的变量,就会造成内存泄漏现象
对于内存使用控制可以极大的提高浏览器使用效率,间接的提高用户的体验程度。
常见的JS内存泄漏
1.不带var或者let去定义变量
例如:
function error1(){
str1 = "我造成了内存泄漏"
}
str1 = "我造成了内存泄漏"
}
等价于:
function error1() {
window.str1 = "我造成了内存泄漏"
}
如何仅仅是为了把str1作为函数中的一个临时变量,不用var 或者 let定义就会产生一个全局变量,从而这块内存就会产生泄露。
当然在这种单个字符串的定义不会造成太大的影响。但是在实际工作中由于代码的数量过多可能会造成大量的代码排查时间。
解决方案推荐:
使用js严格模式进行开发, ‘use strict’; 这样会对这种为按照规范写的代码报错进行排查。
2.由于闭包引起的内存泄漏
例如:(来自百度的经典例子)
function say667() {
var num = 666; //此变量被闭包所使用,无法回收
var sayAlert = function() { alert(num); }
num++;
return sayAlert;
}
var sayNumber = say667();
sayNumber(); // alerts 667
var num = 666; //此变量被闭包所使用,无法回收
var sayAlert = function() { alert(num); }
num++;
return sayAlert;
}
var sayNumber = say667();
sayNumber(); // alerts 667
3.dom清空或删除,事件未清除导致
$('#container').bind('click', function(){ console.log('click');}).remove();// zepto 和原生 js下,#container dom 元素,还在内存里jquery 的 empty和 remove会帮助开发者避免这个问题
$('#container').bind('click', function(){ console.log('click');}).off('click').remove();//把事件移除即可,切记不可用unbind('click')
4.子元素存在引用引起的(来自网络的大神一张图片足以说明)
- 黄色是指直接被 js变量所引用,在内存里
- 红色是指间接被 js变量所引用,如上图,refB 被 refA 间接引用,导致即使 refB 变量被清空,也是不会被回收的
- 子元素 refB 由于 parentNode 的间接引用,只要它不被删除,它所有的父元素(图中红色部分)都不会被删除
阅读全文
0 0
- js内存泄漏详解
- js内存泄漏
- JS内存泄漏
- js 内存泄漏
- js内存泄漏
- 关于JS内存泄漏
- JS内存泄漏排查
- js内存泄漏问题
- JS内存泄漏笔记
- js内存泄漏
- js内存泄漏
- JS的内存泄漏
- 内存泄漏详解
- 内存泄漏详解(2)
- android 内存泄漏详解
- Java内存泄漏详解
- android 内存泄漏详解
- JAVA 内存泄漏详解
- 基于Apache CXF和Java(spring+maven)的webservice服务端实现
- react-redux异步加载时使用的中间件
- wdatePicker日历控件
- 搜索框点击文字消失、带背景
- How can I find out which process and user is modifying a file?
- js内存泄漏详解
- Ubuntu14.04 +caffe+pycaffe安装
- Android CoordinatorLayout布局的使用方式和属性
- 软件工程(C编码实践篇)学习总结
- 人工智能词汇含义及关系
- SVN分支/合并原理及最佳实践
- 内存和flash
- pl/sql关于新建不同的窗口
- 第十周 项目3