为了账号安全,请及时绑定邮箱和手机立即绑定

垃圾收集如何在JavaScript中运行?

垃圾收集如何在JavaScript中运行?

杨魅力 2019-09-02 15:28:31
垃圾收集如何在JavaScript中运行?它与.NET垃圾收集类似吗?是因为在VBScript中实现垃圾收集很糟糕,以至于人们避开垃圾收集并建立了对JavaScript作为标准客户端语言的偏好?
查看完整描述

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>


查看完整回答
反对 回复 2019-09-02
?
ibeautiful

TA贡献1993条经验 获得超5个赞

原则上,垃圾收集在所有语言中使用类似的方法。然而,它们的实现在不同环境中会有所不同(例如,每个浏览器使用不同的方式实现JavaScript GC)。对于Chrome的GC的一个非常简短的概述,例如见这个。


至于VBScript,它是作为JavaScript竞争对手/替代语言创建的,只能在IE中运行。在引入VBS时,这是一个相当合理的决定 - IE拥有90%以上的浏览器份额,看起来VBS可以取代(当时广泛支持的,功能较旧且功能较差的)JavaScript; 现在不是那么多。此外,VBScript基本上是Visual Basic Lite,具有该品牌的所有负面内涵。


查看完整回答
反对 回复 2019-09-02
  • 2 回答
  • 0 关注
  • 287 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信