缘起与群里贴出的一段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并没有多此一举。