function fors(){obj_a = obj_b;obj_b.attr = obj_a;}

function fors(){obj_b = {};obj_b.attr = obj_b;}

上面是两个个很显示的循环引用,IE中产生了内存泄露,由于IE的内存回收机制,导至会长期占用内存而不能释放。

但闭包的内存泄露,有些隐蔽。因为闭包的循环引用,是间接的。

function iememery(){var js_obj = document.createElement("div");js_obj.oncontextmenu = function(){ return false;}    }

<body οnlοad="iememery()">

从表面上看,没有任何循环引用。但上面是一个闭包,根据闭包的特性,内部函数有权访问外部函数的变量对象。所以当iememery()执行之后:

js_obj是一个DOM元素的引用,DOM元素它长期在网页当中,不会消失,而这个DOM元素的一属性oncontextmenu,又是内部的函数引用(闭包),而这个匿名函数又和js_obj之间有隐藏的关联(作用域链)
所以形成了一个,循环引用.即:
js_obj.oncontextmenu 间接引用到 js_obj 

也就是说,这个对象的一个属性,又间接的引用了自己。

只要有循环引用,就会在IE下产生内存泄露。

打开你的windows任务管理器,在IE中不停刷新含有这个代码的html页面,看看Iexploer进程的内存占用情况,一直上升,且不会自动回收(降低);
解决办法:
    function iememery(){var js_obj = document.createElement("div");js_obj.oncontextmenu = function(){ return false;};
      js_obj.oncontextmenu = null;//加上这句,断开引用 }

当IE中发生js对象与dom对象直接的循环引用,并且之后没有引用指向他们,如果是IE 6, 内存泄漏,直到关闭IE进程为止如果是IE 7,内存泄漏, 直到离开当前页面为止如果是IE 8, GC回收器回收他们的内存,无论当前是不是compatibility模式。之前的IE js引擎里的GC回收器只能处理js对象,不能处理DOM对象。

原文:http://www.cnblogs.com/lufy/archive/2012/05/18/2507536.html

转载于:https://www.cnblogs.com/ctt-luoluo/archive/2012/05/22/2513686.html

Javascript--闭包引起的IE内存泄露(转载)相关推荐

  1. JavaScript 的垃圾回收与内存泄露

    2019独角兽企业重金招聘Python工程师标准>>> JavaScript采用垃圾自动回收机制,运行时环境会自动清理不再使用的内存,因此javascript无需像C++等语言一样手 ...

  2. JavaScript内存泄露,闭包内存泄露如何解决

    转载于:JavaScript内存泄露,闭包内存泄露如何解决 - 一粒一世界 - 博客园 JavaScript 内存泄露的4种方式及如何避免 简介 什么是内存泄露? JavaScript 内存管理 Ja ...

  3. 闭包,作用域链,垃圾回收,内存泄露

    关于闭包,我翻了几遍书,看了几遍视频,查了一些资料,可是还是迷迷糊糊的,干脆自己动手来个总结吧 !欢迎指正... (- o -)~zZ 1. 什么是闭包? 来看一些关于闭包的定义: 闭包是指有权访问另 ...

  4. js垃圾回收机制,内存泄露和内存溢出,解决闭包产生的内存泄露详解

    一.内存的周期和回收机制 分配内存----->使用内存----->释放内存 1.JS 环境中分配的内存有如下声明周期: 内存分配:当我们声明变量.函数.对象的时候,系统会自动为他们分配内存 ...

  5. JavaScript 内存泄露的4种方式及如何避免

    内存泄露是每个开发者最终都要面对的问题,它是许多问题的根源:反应迟缓,崩溃,高延迟,以及其他应用问题. 什么是内存泄露? 本质上,内存泄露可以定义为:应用程序不再需要占用内存的时候,由于某些原因,内存 ...

  6. JavaScript内存泄露的4种方式及如何避免

    简介 内存泄露是每个开发者最终都要面对的问题,它是许多问题的根源:反应迟缓,崩溃,高延迟,以及其他应用问题. 什么是内存泄露? 本质上,内存泄露可以定义为:应用程序不再需要占用内存的时候,由于某些原因 ...

  7. 进入Xcode4,选择菜单“Product”-“Profile”,快捷键Command+I 监测内存泄露

    进入Xcode4,选择菜单"Product"->"Profile",快捷键Command+I 监测内存泄露 转载于:https://blog.51cto. ...

  8. javascript内存泄露

    2019独角兽企业重金招聘Python工程师标准>>> 1. 什么是内存泄露? 内存泄露是指分配给应用的内存不能被重新分配,即使在内存已经不被使用的时候.正常情况下,脚本引擎通过垃圾 ...

  9. 学习Javascript闭包(Closure)(转载+理解心得)

    以前看了闭包的文章,感觉都没有这次理解的深刻,主要是说到了把"局部函数返回给了全局变量",而根据我的理解,全局变量是在内存里专门分配了一块. 从程序开始直到结束一直存在的,所以闭包 ...

最新文章

  1. Centos7 MYSQL安装与基础命令运用
  2. Android Service与Activity的交互
  3. 重叠面积_重叠面积——动点产生的重叠面积问题
  4. pg数据库有雷锋?用户已有权限为何无故消失?
  5. 一图看懂cortex-M0/M3矢量表,记住LSB置1表示Thumb
  6. python嵌套列表法实现树_在python中创建递归迭代嵌套列表的“数据树”路径
  7. .gitignore文件不生效解决方法
  8. js引用类型和基本类型、隐式类型转换以及强制类型转换面试题
  9. 计算机二级office知识大纲,2017计算机二级考试MS office 考试内容大纲
  10. 自动化测试面试题整理出炉附答案,建议收藏
  11. java pdf 水印_java 如何给pdf文件加水印
  12. liunx下设置自动完成任务(每周六晚一点整,系统自动把/home目录文件下到所有文件做一个备份,备份到/var/backups/home.tar.gz))
  13. 【阿里云】云服务器ECS怎么一键重装系统
  14. Matlab 界面设计简单入门(App Designer)
  15. 2021年——1024程序员节
  16. 基于B/S的学生网上考试系统(ssh,mysql)
  17. 行业分析-磁共振造影剂市场现状及未来发展趋势
  18. 【SQL练习】创建表格,并添加记录
  19. 智慧应急解决方案-最新全套文件
  20. Linux下编译内核配置选项简介

热门文章

  1. 第三十九讲:tapestry 页面加载等待过程(ProgressiveDisplay)组件
  2. python代码性能优化技巧
  3. Sqlite优化记录:使用全文索引加快检索速度-转
  4. aws 部署python lambda_awslambda-为Lambda工具部署Python项目。-Philipp Gorczak Getting started Usage...
  5. MD5加密 java实现
  6. 下面介绍几种查看linux版本信息的方法和GCC版本
  7. Cloudera果然向云出手了!新机器学习服务采用云原生路径!
  8. Linux防火墙-netfilter-iptables
  9. Android Eclipseproject开发中的常见调试问题(二)android.os.NetworkOnMainThreadException 异常的解决的方法...
  10. Google发布Puppeteer 1.0