1、什么是闭包、以及闭包所涉及的作用域链这里就不说了。
2、JavaScript垃圾回收机制
JavaScript不需要手动地释放内存,它使用一种自动垃圾回收机制(garbage collection)。当一个对象无用的时候,即程序中无变量引用这个对象时,就会从内存中释放掉这个变量。
Code
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--> var s = [ 1, 2 ,3];
var s = null;
//这样原始的数组[1 ,2 ,3]就会被释放掉了。
3、循环引用
三个对象 A 、B 、C
AàBàC :A的某一属性引用着B,同样C也被B的属性引用着。如果将A清除,那么B、C也被释放。
AàBàCàB :这里增加了C的某一属性引用B对象,如果这是清除A,那么B、C不会被释放,因为B和C之间产生了循环引用。
Code
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--> var a = {};
a.pro = { a:100 };
a.pro.pro = { b:100 };
a = null ;
//这种情况下,{a:100}和{b:100}就同时也被释放了。
var obj = {};
obj.pro = { a : 100 };
obj.pro.pro = { b : 200 };
var two = obj.pro.pro;
obj = null;
//这种情况下 {b:200}不会被释放掉,而{a:100}被释放了。
4、循环引用和闭包
Code
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--> function outer(){
var obj = {};
function inner(){
//这里引用了obj对象
}
obj.inner = inner;
}
这是一种及其隐蔽的循环引用,。当调用一次outer时,就会在其内部创建obj和inner两个对象,obj的inner属性引用了inner;同样inner也引用了obj,这是因为obj仍然在innerFun的封闭环境中,准确的讲这是由于JavaScript特有的“作用域链”。
因此,闭包非常容易创建循环引用,幸运的是JavaScript能够很好的处理这种循环引用。
5、IE中的内存泄漏
IE中的内存泄漏有好几种,这里有详细的解释(http://msdn.microsoft.com/en-us/library/bb250448.aspx),园子里也有翻译了(http://www.cnblogs.com/birdshome/archive/2006/05/28/ie_memoryleak.html)。
这里只讨论其中一种,即循环引用所造成的内存泄漏,因为,这是一种最普遍的情况。
当在DOM元素或一个ActiveX对象与普通JavaScript对象之间存在循环引用时,IE在释放这类变量时存在特殊的困难,最好手动切断循环引用,这个bug在IE 7中已经被修复了(http://www.quirksmode.org/blog/archives/2006/04/ie_7_and_javasc.html)。
“IE 6 suffered from memory leaks when a circular reference between several objects, among which at least one DOM node, was created. This problem has been solved in IE 7. ”
如果上面的例子(第4点)中obj引用的不是一个JavaScript Function对象(inner),而是一个ActiveX对象或Dom元素,这样在IE中所形成的循环引用无法得到释放。
Code
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--> function init(){
var elem = document.getElementByid( 'id' );
elem.onclick = function(){
alert('rain-man');
//这里引用了elem元素
};
}
Elem引用了它的click事件的监听函数,同样该函数通过其作用域链也引用回了elem元素。这样在IE中即使离开当前页面也不会释放这些循环引用。
6、解决方法
基本的方法就是手动清除这种循环引用,下面一个十分简单的例子,实际应用时可以自己构建一个addEvent()函数,并且在window的unload事件上对所有事件绑定进行清除。
Code
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--> function outer(){
var one = document.getElementById( 'one' );
one.onclick = function(){};
}
window.onunload = function(){
var one = document.getElementById( 'one' );
one.onclick = null;
};
其它方法(by:Douglas Crockford)
Code
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->/**
* 遍历某一元素节点及其所有后代元素
*
* @param Elem node 所要清除的元素节点
* @param function func 进行处理的函数
*
*/
function walkTheDOM(node, func) {
func(node);
node = node.firstChild;
while (node) {
walkTheDOM(node, func);
node = node.nextSibling;
}
}
/**
* 清除dom节点的所有引用,防止内存泄露
*
* @param Elem node 所要清除的元素节点
*
*/
function purgeEventHandlers(node) {
walkTheDOM(node, function (e) {
for (var n in e) {
if (typeof e[n] ===
'function') {
e[n] = null;
}
}
});
转自:http://04js.cn/content.asp?id=1614
分享到:
相关推荐
7. **安全性**:源码应该考虑用户隐私,避免泄露用户的RSS订阅信息。同时,对输入进行验证,防止XSS(跨站脚本攻击)和SQL注入等安全风险。 8. **可扩展性**:优秀的源码应具备良好的架构,方便添加新功能,如支持...
【RSS阅读器】是一种在线订阅和获取新闻、博客更新或其他信息源内容的系统。它允许用户在一个集中的界面中查看来自多个来源的信息,无需逐一访问各个网站。在JAVA_WEB项目开发中,创建RSS阅读器涉及到的技术和流程...
【Android手机RSS阅读器html5.zip】是一款专为Android平台设计的RSS阅读应用,它结合了HTML5技术,提供了一种高效、便捷的方式来获取和阅读RSS订阅源中的内容。这款应用充分利用了HTML5的特性,如离线存储、多媒体...
【标题】"RSS Episode Filter: 开始应用"指的是一个针对RSS(Really Simple Syndication) feed的筛选工具,可能是一个JavaScript项目,旨在帮助用户过滤和管理RSS订阅中的特定章节或剧集。RSS是一种标准,用于发布...
总结起来,网站开发中的注册与登录、留言版和RSS订阅模块涉及到了用户认证、数据交互、内容管理等多个方面,而ASP.NET和C#提供了强大的工具和框架来支持这些功能的实现。掌握这些核心知识点,不仅能够帮助初学者快速...
【wino-crx插件】是一款专为英语用户设计的RSS阅读器WebExtension,它主要以Rust编程语言实现,提供了高效、安全的订阅和管理RSS源的能力。WebExtension是一种浏览器扩展技术,允许开发者利用JavaScript、HTML和CSS...
同时,博主可能还会配置RSS订阅源,允许读者通过RSS阅读器订阅更新。 博客的管理和维护还包括定期备份、版本控制、错误修复以及安全防护。例如,确保不泄露敏感信息,使用HTTPS进行加密传输,以及定期更新依赖库以...
6. **RSS订阅**:提供RSS feed,让其他平台或用户可以订阅博客更新。 六、安全性与优化 1. **SQL注入防护**:确保所有的数据库查询都使用参数化或ORM框架,避免恶意输入导致的数据泄露。 2. **XSS攻击防御**:对...
2. **RSS/Atom订阅**:许多新闻网站提供RSS(简易聚合)或Atom格式的订阅源,新闻阅读器通过解析这些XML文件获取最新的文章标题、摘要和链接。用户可以订阅感兴趣的新闻源,阅读器会自动检查更新并呈现内容。 3. **...
4. **google_chrome_rss_icon.user.js**:这个脚本可能在Chrome浏览器中添加了一个功能,使得用户可以在支持RSS订阅的网站上快速找到并订阅RSS源。 5. **SmoothScroll.user.js**:这类脚本通常用于平滑滚动页面,...
FeedWrangler 是一款流行且功能丰富的 RSS 订阅服务,它允许用户跟踪并管理他们喜欢的博客、新闻站点和其他在线内容的更新。PageWrangler 的出现是为了弥补 FeedWrangler 在网页版中可能存在的操作不便,通过提供...
- 使用URL重写技术,提供RSS订阅、百度网站地图等服务,有助于提高搜索引擎友好性。 - 对于动态页面,如果条件允许,考虑使用`.ashx`扩展名,因为它们通常比`.aspx`文件加载更快。 - 发布网站时使用Release版本而非...
它们能定时获取内容源,如RSS订阅、数据库或者用户指定的文本文件,然后根据预设的时间间隔和规则发布到不同的账号上。 2. **API接口使用**:微头条提供了开发者API,允许第三方应用进行内容发布和用户管理。理解...
新闻展示部分可能采用了RSS订阅或者API接口的方式,实时获取并更新新闻内容。这需要后端与外部新闻源进行通信,可能涉及到HTTP请求、JSON解析等技术。新闻数据通常存储在数据库中,以便快速检索和展示。 系统开发中...
与XML格式的RSS或Atom相比,JSON Feed采用JSON(JavaScript Object Notation)作为其数据载体,JSON是一种轻量级的数据交换语言,易于人类阅读和编写,同时也易于机器解析和生成。由于其简洁的语法,JSON Feed在开发...
播客源通常以RSS(Really Simple Syndication)或Atom格式提供,这些格式可以将新发布的剧集信息推送给订阅者。Podfeeds可能提供了这样的功能,允许用户添加和管理这些源,以便于跟踪更新和新内容。 标签"HTML"表明...
4. **API接口**:为了获取和更新实时资讯,程序可能需要对接第三方API,例如RSS订阅服务、新闻聚合API或社交媒体API。 5. **用户体验(UX)和响应式设计**:确保程序在不同设备上(如手机、平板电脑和桌面电脑)都...
后台可能采用RSS订阅或爬虫技术收集信息,再通过内容管理系统(CMS)进行编辑和发布,同时推送通知至用户端,这涉及到了推送服务如极光推送或信鸽推送。 5. **微信小程序开发**:作为一款微信小程序,其开发遵循...
RSS(简易信息聚合)让订阅和分享内容变得更加便捷;以及博客、社交媒体、维基百科等用户参与度极高的应用。 2.4 Web 2.0时代的精髓——以人为本 Web 2.0的核心在于用户,它鼓励用户成为内容的创造者和传播者,而...
6. **信息聚合与监控**:使用工具或编程方法自动化收集和分析大量信息,例如RSS订阅、Twitter流抓取等。 7. **隐私保护与匿名性**:理解如何保护自己的在线隐私,以及识别他人可能的隐私泄露。 8. **法律与道德...