Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
匿名JavaScript对象占用内存吗?_Javascript - Fatal编程技术网

匿名JavaScript对象占用内存吗?

匿名JavaScript对象占用内存吗?,javascript,Javascript,如果我有以下代码: var a = {a:1,b:2,c:3} ['a'] var b = {a:1,b:2,c:3} ['b'] 我创建了两个匿名JavaScript对象。匿名JavaScript对象是否占用内存?或者它们是即时垃圾收集的吗?下面是一个垃圾收集工作原理的示例,与您的问题类似,您会注意到o2.a与您的场景类似。还应注意,由于对象的一部分仍在使用中,因此整个变量仍在使用中 var o = { a: { b:2 } }; // 2 objects are cre

如果我有以下代码:

var a = {a:1,b:2,c:3} ['a']
var b = {a:1,b:2,c:3} ['b']

我创建了两个匿名JavaScript对象。匿名JavaScript对象是否占用内存?或者它们是即时垃圾收集的吗?

下面是一个垃圾收集工作原理的示例,与您的问题类似,您会注意到o2.a与您的场景类似。还应注意,由于对象的一部分仍在使用中,因此整个变量仍在使用中

var o = { 
  a: {
    b:2
  }
}; 
// 2 objects are created. One is referenced by the other as one of its property.
// The other is referenced by virtue of being assigned to the 'o' variable.
// Obviously, none can be garbage-collected


var o2 = o; // the 'o2' variable is the second thing that 
            // has a reference to the object
o = 1;      // now, the object that was originally in 'o' has a unique reference
            // embodied by the 'o2' variable

var oa = o2.a; // reference to 'a' property of the object.
               // This object has now 2 references: one as a property, 
               // the other as the 'oa' variable

o2 = "yo"; // The object that was originally in 'o' has now zero
           // references to it. It can be garbage-collected.
           // However what was its 'a' property is still referenced by 
           // the 'oa' variable, so it cannot be free'd

oa = null; // what was the 'a' property of the object originally in o 
           // has zero references to it. It can be garbage collected.
所以一般来说,我会说,是的,它们仍然占用内存


但是,我也怀疑许多浏览器会足够聪明,能够发现您只在该行上创建了对象,并且只分配了其中的一部分,因此没有理由保留整个对象,并且可能会删除它。但一般来说,只要a或b变量存在,内存就会被使用

每个匿名对象在用于属性查找时都必须存在,因此在此期间需要占用内存。属性查找完成后,对象将不再使用,因此它将成为垃圾


无法保证垃圾将在何时被真正收集,因此在这些行运行之后,对象可能仍然存在于内存中。但是它们符合垃圾收集的条件,将来JavaScript引擎需要为其他数据释放内存时,它们将被收集。

表达式匿名JavaScript对象有点奇怪。JavaScript对象只是对象,本身没有名称。它们可以被其他事物引用,也可以不被其他事物引用,包括但不限于分配给它们的变量。例如,考虑以下情况:

function make_getter(obj) { return function(p) { return obj[p]; }; }

var getter = make_getter({a: 1});
这里{a:1}是匿名的,但由于它被关闭,在make_getter返回并分配给getter的函数中被引用,只要getter仍在作用域中,对象就不能也不会被垃圾收集

对象是否被垃圾回收与是否在某个活动上下文中被引用有关,而不仅仅是它是否被分配给变量。它可能被分配给一个变量,但已超出范围;或者,它可能没有分配给变量,但仍然存在于某个范围内

正如其他帖子所提到的,实际的GC发生在引擎感觉像它的时候,而你没有或者不需要控制它

换言之,以下两个片段在GC方面是相同的:

function gc1() {
    return {a:1, b:2, c:3}['a'];
}

function gc2() {
    var o = {a:1, b:2, c:3};
    return o['a'];
}

没有人在乎你是否给这个物体起了个名字。问题是它何时超出范围,在本例中,超出范围发生在函数末尾。

所有内容都需要内存。然后它被释放,一段时间后垃圾被收集。垃圾收集依赖于特定浏览器中使用的实现ie javascript引擎,因此无法猜测。不用担心,只要根据需要使用它们就行了这是一个实现细节。我可以想象,在这个简单的例子中,大多数现代引擎都会优化对象。“你有更真实的例子吗?”斯奎特说。。不太确定“do”,因为这是一个非常罕见的用法。但是有一些令人印象深刻的前端优化。关于您的更新:您发布的代码是JavaScript,而不是JSON。现在还不清楚为什么要回滚将其更改为JavaScript的编辑。但它不是JSON,而是一个JavaScript对象。JSON是用于数据序列化的文本格式:如果您编写了JSON.parse{a:1,b:2,c:3},那么您将使用JSON作为创建JavaScript对象的一种方式。字符串是JSON;通过解析生成的对象——或者在本例中,是您直接在源代码中编写的对象文本,而无需从JSON解析——是一个普通的JavaScript对象。