为什么在函数外声明变量并在循环中赋值,使用的内存多于局部变量?

时间:2015-03-29 23:12:58

标签: javascript memory garbage-collection

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

(function() {
  function createVars() {
    var i;
    var b;
    for (i = 0; i < 10000; i += 1) {
      b = Math.random();
    }
    requestAnimationFrame(createVars);
  };

  requestAnimationFrame(createVars);
}())

case 1

第二个:

(function() {
  var b;

  function createVars() {
    var i;
    for (i = 0; i < 10000; i += 1) {
      b = Math.random();
    }
    requestAnimationFrame(createVars);
  };

  requestAnimationFrame(createVars);
}())

case 2
我本来期望相反或至少是类似的行为。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

首先,每次调用'createVars'时都会创建一个'b'变量。 第二种情况,您只使用一个变量。总是一样。 :)