JavaScript高级程序设计之函数表达式之闭包之内存泄漏第7.2.3讲笔记
来源:互联网 发布:怪物猎人x 网络联机 编辑:程序博客网 时间:2024/05/22 04:27
由于 IE9 之前的版本对 JScript 对象和 COM 对象使用不同的垃圾收集例程(第 4 章曾经讨论过) ,因此闭包在 IE 的这些版本中会导致一些特殊的问题。具体来说,如果闭包的作用域链中保存着一个
以上代码创建了一个作为 element 元素事件处理程序的闭包,而这个闭包则又创建了一个循环引
用(事件将在第 13 章讨论) 。由于匿名函数保存了一个对 assignHandler() 的活动对象的引用,因此
就会导致无法减少 element 的引用数。只要匿名函数存在, element 的引用数至少也是 1,因此它所
占用的内存就永远不会被回收。不过,这个问题可以通过稍微改写一下代码来解决,如下所示。
在上面的代码中, 通过把 element.id 的一个副本保存在一个变量中, 并且在闭包中引用该变量消
除了循环引用。但仅仅做到这一步,还是不能解决内存泄漏的问题。必须要记住:闭包会引用包含函数
的整个活动对象,而其中包含着 element 。即使闭包不直接引用 element ,包含函数的活动对象中也
仍然会保存一个引用。因此,有必要把 element 变量设置为 null 。这样就能够解除对 DOM 对象的引
用,顺利地减少其引用数,确保正常回收其占用的内存。
HTML 元素,那么就意味着该元素将无法被销毁。来看下面的例子。
function assignHandler(){var element = document.getElementById("someElement");element.onclick = function(){alert(element.id);};}
以上代码创建了一个作为 element 元素事件处理程序的闭包,而这个闭包则又创建了一个循环引
用(事件将在第 13 章讨论) 。由于匿名函数保存了一个对 assignHandler() 的活动对象的引用,因此
就会导致无法减少 element 的引用数。只要匿名函数存在, element 的引用数至少也是 1,因此它所
占用的内存就永远不会被回收。不过,这个问题可以通过稍微改写一下代码来解决,如下所示。
function assignHandler(){var element = document.getElementById("someElement");var id = element.id;element.onclick = function(){alert(id);};element = null;}
在上面的代码中, 通过把 element.id 的一个副本保存在一个变量中, 并且在闭包中引用该变量消
除了循环引用。但仅仅做到这一步,还是不能解决内存泄漏的问题。必须要记住:闭包会引用包含函数
的整个活动对象,而其中包含着 element 。即使闭包不直接引用 element ,包含函数的活动对象中也
仍然会保存一个引用。因此,有必要把 element 变量设置为 null 。这样就能够解除对 DOM 对象的引
用,顺利地减少其引用数,确保正常回收其占用的内存。
0 0
- JavaScript高级程序设计之函数表达式之闭包之内存泄漏第7.2.3讲笔记
- JavaScript高级程序设计之函数表达式之闭包之闭包与变量第7.2.1讲笔记
- JavaScript高级程序设计之函数表达式之闭包之关于 this 对象第7.2.2讲笔记
- JavaScript高级程序设计之函数表达式之递归第7.1讲笔记
- JavaScript高级程序设计之函数表达式之模仿块级作用域第7.3讲笔记
- JavaScript高级程序设计之函数表达式之私有变量之增强的模块模式第7.4.3讲笔记
- JavaScript高级程序设计之函数表达式之闭包第7.2讲笔记
- JavaScript高级程序设计之函数表达式之私有变量之静态私有变量第7.4.1讲笔记
- JavaScript高级程序设计之函数表达式之私有变量之模块模式第7.4.2讲笔记
- JavaScript高级程序设计之JavaScript 简介 第1.1讲笔记
- JavaScript高级程序设计之JavaScript实现 第1.2讲笔记
- JavaScript高级程序设计之JavaScript 版本 第1.3讲笔记
- JavaScript高级程序设计之基本概念之函数第3.7讲笔记
- JavaScript高级程序设计之面向对象的程序设计之创建对象之 构造函数模式第6.2.2讲笔记
- JavaScript高级程序设计之面向对象的程序设计之继承之借用构造函数第6.3.2讲笔记
- JavaScript高级程序设计之BOM之window 对象之窗口位置第8.1.3讲笔记
- JavaScript高级程序设计之面向对象的程序设计之创建对象之原型模式 第6.2.3讲笔记
- JavaScript高级程序设计之面向对象的程序设计之继承之组合继承第6.3.3讲笔记
- 剑指offer—合并两个排序的链表
- 制作网页2---PHP学习拾遗
- 观影有感
- HDU 2082 母函数
- 第二十四篇:缩合练习代码---简单微博(自定义Cell)
- JavaScript高级程序设计之函数表达式之闭包之内存泄漏第7.2.3讲笔记
- 观影有感2
- 将long型数转化为流量格式大小的工具类
- Android微信支付:如何跑通微信支付官方Demo
- ocp-12
- ocp-13
- Genymotion安装软件失败;向Genymotion虚拟机拖入apk提示错误
- ocp-14
- Android和服务器长连接