栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

JavaScript中的垃圾回收如何工作?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JavaScript中的垃圾回收如何工作?

垃圾收集如何工作?

简短的答案是:当某个内存块(例如某个对象)不再可访问时,有资格回收它。何时,如何回收或是否回收它完全取决于实现,并且不同的实现方式也不同。但是在语言级别,它是自动的。

例如:

function foo() {    var bar;    bar = new ReallyMassiveObject();    bar.someCall();}

foo
返回时,目标
bar
指向是自动进行垃圾回收,因为没有什么留给有对它的引用。

与:

function foo() {    var bar;    bar = new ReallyMassiveObject();    bar.someCall();    return bar;}// elsewherevar 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
newFunction
可能在运行时动态引用它的代码,因此Javascript引擎可以安全地将
bar
函数所引用的上下文排除在外,从而使它所引用的内容符合GC的要求,而现代人则可以。

Javascript在清理循环引用btw方面没有问题,例如:

function foo() {    var a, b;    a = {};    b = {};    b.refa = a;    a.refb = b;}

foo
返回时,这一事实
a
被提及
b
,反之亦然是没有问题的。由于没有其他任何内容涉及它们中的任何一个,因此它们都可以清除。在IE上,如果其中一个对象是主机提供的对象(例如DOM元素或通过创建的对象)而不是Javascript对象,则情况
并非 如此
newActiveXObject
。(因此,例如,如果将Javascript对象引用放在DOM元素上,并且Javascript对象又引用了DOM元素,即使没有人引用它们,它们也会彼此保留在内存中。)但这是IE
错误的 问题 ,而不是Javascript。

回覆:

是因为vbscript GC不好,所以人们将javascript用作他们的标准客户端api吗?

Javascript是 原始的
客户端Web脚本语言。VBscript只是在Microsoft推出浏览器之后才出现,并且仅在Microsoft浏览器中受支持。如果您想使用最广泛的浏览器,Javascript曾经是并且是唯一的客户端脚本编写游戏。
< subjective>它也是经典VBscript的八倍。;-)



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/366365.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号