新的局部变量在大的FOR循环,这是一个问题

New Local variable inside large FOR loops, is this a issue?

本文关键字:一个 问题 局部变量 FOR 循环      更新时间:2023-09-26

在这个简单的示例函数中:

doSomething = function(withThisId) {
  var videos      = getVideos(), // array of videos
      discovered  = false
  ;
  for(var i = 0; i < 50000; i++) {
    var keepToCheck = videos[i];
    if(keepToCheck.id == withThisId) {
      discovered = true;
      break;
    }
  }
  return discovered;
};

我想知道是否:

  1. for循环中,我们在每次迭代时初始化一个名为keepToCheck的新变量,然后将其用于某些内容。这是否意味着每次都会创建一个新变量,因此我们可能有50,000个keepToCheck变量存在于内存中(直到GC清除它)?

    或者JS引擎足够聪明,知道变量可以被重用,而不是创建重复?

  2. 如果我们在for循环之外初始化var keepToCheck,然后将其设置为keepToCheck = videos[i];,是否有性能优势?

我一直在努力研究这个问题,但在网上找不到任何建议。

在JavaScript中,只会创建一个变量。在第一次迭代之后,keepToCheck已经存在,并且将被覆盖,而不是重新创建。

然而,出于组织目的,我更愿意在知道需要时列出所有变量。在本例中,我将输入:

var videos = getVideos(),
    discovered = false,
    keepToCheck, i;

后面跟着其余的代码。如果某些变量仅在if中使用,则在该块中首先对它们进行var

变量被"提升"到声明它们的函数的顶部,如果被覆盖,则被垃圾收集(完全由VM/浏览器调度)。重复的var语句(例如,在循环中)只是浪费。虽然内存中不会有50k变量,但它会浪费处理时间和一些内存,具体取决于垃圾收集何时运行。这就是为什么最好在函数的顶部声明变量的原因。试着在这段代码上运行JSLint/JShint,看看我的意思。

不太了解JS,但在其他有垃圾收集的语言中,局部变量不受垃圾收集的影响——它们存在于堆栈中,所以在作用域离开后它们就消失了。因此,不能同时存在一个以上的这些变量。但是,您可能会在每次迭代中使用不同的地址。