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并没有多此一举。

转载于:https://www.cnblogs.com/sparks345/archive/2012/05/16/2505405.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值