Ali*_*ini 29 javascript vbscript garbage-collection
垃圾收集如何在JavaScript中运行?它与.NET垃圾收集类似吗?是因为在VBScript中实现垃圾收集很糟糕,以至于人们避开垃圾收集并建立了对JavaScript作为标准客户端语言的偏好?
T.J*_*der 80
垃圾收集如何工作?
简短的回答是:当一块内存(比如一个对象)不再可达时,它就有资格被回收.它何时,如何或是否被回收完全取决于实现,并且不同的实现以不同的方式进行.但在语言层面,它是自动的.
例如:
function foo() {
var bar;
bar = new ReallyMassiveObject();
bar.someCall();
}
Run Code Online (Sandbox Code Playgroud)
当foo返回时,目标bar指向是自动进行垃圾回收,因为没有什么留给有对它的引用.
对比:
function foo() {
var bar;
bar = new ReallyMassiveObject();
bar.someCall();
return bar;
}
// elsewhere
var b = foo();
Run Code Online (Sandbox Code Playgroud)
...现在对该对象的引用在该调用中幸存,并持续到/除非调用者将其他内容分配给范围b或b超出范围.
另外对比:
function foo() {
var bar;
bar = new ReallyMassiveObject();
bar.someCall();
setTimeout(function() {
alert("Three seconds have passed");
}, 3000);
}
Run Code Online (Sandbox Code Playgroud)
这里,即使在foo返回之后,计时器机制也会引用计时器回调,而计时器回调 - 一个闭包 - 引用它创建的上下文,而后者又包含bar变量.因此,从理论上讲,返回bar时不能立即进行垃圾收集foo.相反,它一直保持到计时器触发并释放其对回调的引用,使得回调及其引用的上下文符合GC的条件.(实际上,现代JavaScript引擎可以并且尽可能地优化闭包.例如,在上面,静态分析显示回调不引用bar,并且不包含任何eval或new Function可能在运行时动态引用它的代码,因此JavaScript引擎可以安全地bar从函数引用的上下文中删除,从而使其引用符合GC的条件 - 而现代的则可以.(有关本文中的闭包的更多信息.)
JavaScript没有问题处理清理循环引用,顺便说一下,例如:
function foo() {
var a, b;
a = {};
b = {};
b.refa = a;
a.refb = b;
}
Run Code Online (Sandbox Code Playgroud)
当foo返回时,这一事实a被提及b,反之亦然是没有问题的.由于没有其他任何内容涉及它们中的任何一个,它们都可以被清理.上IE,这是不如果对象中的一个是主机提供的对象(例如,DOM元素或通过创建真实的东西new ActiveXObject),而不是一个JavaScript对象.(例如,如果你将一个JavaScript对象引用放在一个DOM元素上,并且JavaScript对象引用回DOM元素,那么即使没有人引用它们中的任何一个,它们也会在内存中相互保留.)但这是一个IE bug 问题,而不是JavaScript的东西.
回覆:
是因为vbscript GC很糟糕,人们还原为javascript作为他们的标准客户端api?
JavaScript是原始的客户端Web脚本语言.VBScript仅在微软推出浏览器后才出现,并且只在Microsoft浏览器中得到支持.如果你想使用最广泛的浏览器,JavaScript曾经并且是城里唯一的客户端脚本游戏.<主观>它也是VBScript经典语言的八倍.;-) </ subjective>
| 归档时间: |
|
| 查看次数: |
12816 次 |
| 最近记录: |