2 回答
TA贡献2016条经验 获得超9个赞
垃圾收集如何工作?
简短的回答是:当一块内存(比如一个对象)不再可达时,它就有资格被回收。它何时,如何或是否被回收完全取决于实现,并且不同的实现以不同的方式进行。但在语言层面,它是自动的。
例如:
function foo() {
var bar;
bar = new ReallyMassiveObject();
bar.someCall();
}
当foo返回时,目标bar指向是自动进行垃圾回收,因为没有什么留给有对它的引用。
对比:
function foo() {
var bar;
bar = new ReallyMassiveObject();
bar.someCall();
return bar;
}
// elsewhere
var b = foo();
...现在对该对象的引用在该调用中幸存,并持续到/除非调用者将其他内容分配给范围b或b超出范围。
另外对比:
function foo() {
var bar;
bar = new ReallyMassiveObject();
bar.someCall();
setTimeout(function() {
alert("Three seconds have passed");
}, 3000);
}
这里,即使在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;
}
当foo返回时,这一事实a被提及b,反之亦然是没有问题的。由于没有其他任何内容涉及它们中的任何一个,它们都可以被清理。上IE,这是不如果对象中的一个是主机提供的对象(例如,DOM元素或通过创建真实的东西new ActiveXObject),而不是一个JavaScript对象。(例如,如果你将一个JavaScript对象引用放在一个DOM元素上,并且JavaScript对象引用回DOM元素,那么即使没有人引用它们中的任何一个,它们也会在内存中相互保留。)但这是一个IE bug 问题,不是JavaScript的东西。
回覆:
是因为vbscript GC很糟糕,人们恢复到javascript作为他们的标准客户端api?
JavaScript是原始的客户端Web脚本语言。VBScript仅在微软推出浏览器后才出现,并且只在微软浏览器中得到支持。如果你想使用最广泛的浏览器,JavaScript曾经并且是城里唯一的客户端脚本游戏。<主观>它也是VBScript经典语言的八倍。;-) </ subjective>
TA贡献1993条经验 获得超5个赞
原则上,垃圾收集在所有语言中使用类似的方法。然而,它们的实现在不同环境中会有所不同(例如,每个浏览器使用不同的方式实现JavaScript GC)。对于Chrome的GC的一个非常简短的概述,例如见这个。
至于VBScript,它是作为JavaScript竞争对手/替代语言创建的,只能在IE中运行。在引入VBS时,这是一个相当合理的决定 - IE拥有90%以上的浏览器份额,看起来VBS可以取代(当时广泛支持的,功能较旧且功能较差的)JavaScript; 现在不是那么多。此外,VBScript基本上是Visual Basic Lite,具有该品牌的所有负面内涵。
添加回答
举报