请问,下面这段代码怎么导致内存泄漏了呢???各位大神评论解析得越详细越好。
是循环引用导致的,还是闭包导致的?

var user = {name: 'tom', age: 20, gender: 'male'}var test = document.getElementByid('test')
test.onclick = function() {
test.innerHTML = user.name;
}// ...后面还有很多其他操作,最后把user对象释放掉user = null;

还有,就是下面这样写为什么可以减少内存泄漏呢

var user = {name: 'tom', age: 20, gender: 'male'}var test = document.getElementByid('test')
(function (name) {
test.onclick = function() {
test.innerHTML = name;
}
})(user.name);
user = null;

回答

你第一段和第二段程序中引用发生的层级不同,一个是在函数体内用匿名函数完成引用(第一段),一个是在外层引用传值(第二段)。

第一段这个匿名函数一直绑定到onclick上,所以绑定不解除,买QQ账号地图引用就不解除,所以即使后面对象变量已经解除绑定了,但对象实体并不能被销毁回收内存(那块实体内存区域还有引用)。

第二段通过一个全局匿名即时调用函数,把user.name引用的具体字符串内容地址给了局部name变量,这个变量再被onclick引用绑定,而字符串的定义JS中是专门区域的,实际上user.name也仅仅是那个字符串区域的一个引用,所以实际上销毁user仅仅是对原来user.name所指区域进行一次减一次引用操作,而具体的区域并不会被回收,还可以被onclick引用绑定。

第一个里面,user一直被那个onclick指向的匿名函数引用,所以在user = null之后不会被回收
第二个里面,事件处理器里引用的是user.name的值,对user没有引用,所以可以在user = null之后被回收

JavaScript防止内存泄漏最有效的方法:少用对象、变量的引用赋值,建议了解下数据结构方面的知识。


更多相关文章

  1. 初识 php 数值运算符与字符串运算符、字符串常用函数与自定义函
  2. 第十三课 PHP常用运算符、函数
  3. 运算符以及函数的使用
  4. 疯狂自定义函数(动态表格)
  5. 使用函数封装一个动态表格,自行写5个系统函数
  6. js语法:数据类型、函数,作用域/作用域链、闭包
  7. PHP函数的使用
  8. 【前端】如何在vue项目中的utils.js封装防抖节流函数
  9. 【前端】如何向requestAnimationFrame的回调函数中传递参数

随机推荐

  1. Building Android Apps with AWS 使用AWS
  2. 【摘录】从Android界面开发谈起
  3. Android 入门篇
  4. android studio 获取证书指纹 SHA1
  5. 每周总结20130821——android控件的尺寸
  6. Android(安卓)重写返回键
  7. android中使用OpenCV之调用设备摄像头
  8. 自己归纳 Android 四种布局简介
  9. React Native踩坑:集成到现有Android原生
  10. android主流分辨率