Javascript 为什么在函数外部声明变量并在循环中赋值要比局部变量占用更多内存?

Javascript 为什么在函数外部声明变量并在循环中赋值要比局部变量占用更多内存?,javascript,memory,garbage-collection,Javascript,Memory,Garbage Collection,我正在做两个简单的测试,并在GoogleDevTools时间表中对它们进行分析。 在函数外部声明变量并在for循环中为其分配新值似乎会分配大量内存并反复触发垃圾收集器。 另一方面,在函数范围内声明变量会分配更少的内存或根本没有内存。 第一种情况是: (函数(){ 函数createVars(){ var i; var b; 对于(i=0;i

我正在做两个简单的测试,并在GoogleDevTools时间表中对它们进行分析。 在函数外部声明变量并在for循环中为其分配新值似乎会分配大量内存并反复触发垃圾收集器。
另一方面,在函数范围内声明变量会分配更少的内存或根本没有内存。
第一种情况是:

(函数(){
函数createVars(){
var i;
var b;
对于(i=0;i<10000;i+=1){
b=数学随机();
}
requestAnimationFrame(createVars);
};
requestAnimationFrame(createVars);

}())
可能的解释:局部变量存储在堆栈上,每次执行包含它们的函数后,都会删除它们。在函数外部定义的全局变量在堆上定义,并在每次执行后继续存在。此外,每次执行时都会创建一个新变量,从而积累更多已使用的内存

第一种情况是,每次调用“createVars”时都创建一个“b”变量。
第二种情况,只使用一个变量。总是一样的。:)

创建一对新变量是什么意思?一个新变量
var b已创建,但这就是问题所在。在第二种情况下,“b”变量只创建一次,而不是每次执行,它会积累更多的内存。答案的第一部分可能是答案。然后它必须与这样一个事实相关,即当您按值传递结果时,它会被复制。相反,当你通过引用传递时,它不是。这就是重点。我每次都创建一个新变量,但它似乎分配的内存更少。不应该是另一种情况吗?但是在第一张图中,内存使用量更大,不是吗?它无限增长!编辑:堆大小还取决于调用“createVars”的次数。因此,如果您运行测试的时间更长,堆大小会增加…实际上,它会更小,这就是为什么不会触发垃圾收集器的原因。第二个图形增长更快,GC大约每10帧发生一次。最后,第二个图形将触发GC并重置。当我在我的计算机上运行它们时:第一个图形达到2500万并增加,第二个图形达到2100万并返回到较低的值。。。我唯一不明白的是,为什么第一个是如此缓慢地增加。。。