0

我发现在 JavaScript 中创建大量对象时,while循环是调整性能的最佳工具。

像这样编写循环时,我得到了最好的速度:

var i = array.length
while (i--) {
  // Do stuff
}

但是,如果我想嵌套一个 while 循环,我必须使用不同的变量名,否则计数器会中断:

var i = array1.length
while (i--) {
  var i = array2.length
  while (i--) {
    // NOPE THE COUNTER IS NOW BROKEN
  }
}

有些人提出了建议j,但为什么不从第一个数组开始,使用一个名为的变量a并从那里向上走呢?

在这种情况下,最佳做法是什么?

有没有办法让delete变量在辅助范围内不可用?

4

2 回答 2

1

使用iand jk如果嵌套那么深,则后面跟着)是许多编程语言共享的标准习语。(事实上​​,i作为循环变量的使用可以追溯到ForTran.

通过使用iand j,任何阅读您的代码的人都应该意识到这些是标准循环和循环计数器。使用a使读者停下来思考“为什么使用它?”

现在,回答你的问题:

在 Javascript 中,如果您想使用匿名函数,您可以重用该变量i- 但这是

  • 非标准做法
  • 一种反模式——又名愚蠢
  • 执行速度较慢。

--

var i = 10;
while (i--) {
  (function() {
    // New function, this is a new `i`, completely masking the original.
    var i = 20;
    while(i--) {
    }
  {();
}
于 2013-08-14T07:09:49.957 回答
1

您在这里需要变量范围。在 C 中,您可以使用块创建变量范围:

int i = 1;
{
    int i = 2;
    printf("inner i = %d\n", i);
}
printf("outer i = %d\n", i);

//=>
inner i = 2
outer i = 1

但是,在 javascript 中,block 不会创建新的变量范围,而是共享外部变量范围。您将需要函数来创建新的变量范围。

var i = 2;
while (i--) {
    console.log("outer i = " + i);
    (function () {
        var i = 3;
        while (i--) {
            console.log("inner i = " + i);
        }
    })();
}

//=>
outer i = 1
inner i = 2
inner i = 1
inner i = 0
outer i = 0
inner i = 2
inner i = 1
inner i = 0
于 2013-08-14T07:13:19.977 回答