如何避免Javascript事件绑定出现内存泄漏

"These memory leaks often occur as a result of circular references between JavaScript objects and objects within IE’s DOM (document object model)." GPDE Team Blog

明显的DOM对象与 JavaScript对象循环引用很好判断,难的是隐含的循环引用判断!

隐含的循环引用需要通过作用域链进行分析判断!

考虑以下代码(感谢可爱的winter ^_^):

var e=document.getElementBy??("XX");
e.onclick=function(){}

scopechain分析:

scopechain.e = document.getElementBy??("XX");
function f(){}
function f(){}.[[scope]] = scopechain
e.onclick = f

很清晰,对不对?

"Javascript绑定事件时,只要DOM的事件里访问不了DOM自己的那个变量就行了" winter

"IE现在的Patch搞得有时候泄露有时候不泄露" winter

 

<button id="testx">No Memory Leak Event Bind</button>
<button id="testy">No Memory Leak Event Bind</button>

<script type="text/javascript">
var fooA = function(){
    var f = function(){alert(this+'\n'+fooA);}
    !function(){
        var d = document.getElementById('testx');
        d.onclick = f;
    }()
}
fooA();

var fooB = function(){
    this.onclick = function(){alert(this+'\n'+fooB);}
}

fooB.call(document.getElementById('testy'));
</script>



[本日志由 dh20156 于 2009-06-06 05:52 PM 编辑]
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: memory leak event bind
评论: 3 | 引用: 0 | 查看次数: 3301
回复回复马士华[2009-01-18 11:28 AM | del]
这个感叹号其实就是对function返回值做非逻辑运算。
回复回复vampire[2008-12-23 11:24 PM | del]
这只是一种情况吧 见www.ibm.com/developerworks/cn/web/wa-memleak/index.html
回复回复vampire[2008-12-23 11:21 PM | del]
发现这里的!function(){}()等同于(function(){})() 请问一下 这是为什么?这个感叹号好诡异
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 关闭 | [img]标签 关闭