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