JS闭包中未使用的引用变量回收机制浅探

缘起与群里贴出的一段sizzle代码:

 

 

 

最后的那段指定为null是否有必要?

 

---------------------------------------忧郁的分割线------------

 

sizzle中的闭包公开了全局函数

Expr.filter.ID
Expr.find.ID

JS中的变量作用域在function,所以说上面两个全局函数销毁前,是可以访问到公开在上层的 root、form这些变量的。

但是全局function中确实又没有用到这两个变量。简单分析到此为止,如果浏览器愿意优化这一点是完全可以避免潜在的内存泄露的。

 

更精彩的在后面同学的回复上:

code:

  <script language="vbscript">
    Class TObject
        Private Sub Class_Initialize()
            alert "initialize"
        End Sub

        Private Sub Class_Terminate()
            alert "terminate"
        End Sub
    End Class

	Function GetTObject()
		Set GetTObject = New TObject
	End Function
</script>

<script language="javascript">
        !function(){
            var o = GetTObject();
            setTimeout(function(){alert(o)}, 5000);
		
			CollectGarbage();
			o=null;//看这里。。。
        }();
</script>

  

通过vb的构造器和回收器机制来检测销毁的触发时机。。

 

进一步琢磨下细节:

1. 先设置o=null,再CollectGarbage,垃圾回收函数调用时会触发vb创建的对象回收器函数,5秒后提示o为null;

2. 先CollectGarbage,再设置o=null,没有触发回收器,5秒后延时回调o为null;

3. 只CollectGarbage,没有触发回收器,5秒后提示“对象不支持此属性或方法”,o已经访问不到了。这是多么纠结的一种状态。。

 

so,sizzle的重置null并没有多此一举。

posted @ 2012-05-16 21:04  sparks345  阅读(612)  评论(0编辑  收藏  举报