【问题标题】:Free the counter variable when a while loop exits in JavaScript当 JavaScript 中的 while 循环退出时释放计数器变量
【发布时间】:2013-08-14 07:04:11
【问题描述】:

我发现在 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 变量使其在辅助作用域中不可用?

【问题讨论】:

  • 看不出有什么问题,为什么很难创建两个变量?
  • @Sergio:在自动生成的代码中可能很烦人
  • @Jackson -- 对于自动生成的代码,我会使用半随机变量名...通常类似于 $$_nameof_of_function_loopNumber
  • @JeremyJStarcher:如果变量被 do stuff 部分中的闭包捕获(并且您希望 value capture 而不是变量捕获)。
  • @6502 - 是的,但是在循环中间的匿名函数的性能影响已经足够了,我不会在需要之前推荐它。嗯..即使那样我也怀疑我会推荐它,并建议将东西放在一个命名函数中调用。

标签: javascript loops while-loop


【解决方案1】:

使用i 和j(如果嵌套那么深,则后面是k)是许多编程语言共享的标准习语。 (其实i作为循环变量的使用可以追溯到ForTran。)

通过使用i 和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--) {
    }
  {();
}

【讨论】:

    【解决方案2】:

    这里需要变量作用域。在 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
    

    【讨论】:

    • 很酷的答案!太土了,哈哈哈。制作一个新函数来保留语义变量名称。 JS很有趣我喜欢。
    猜你喜欢
    • 2016-02-27
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多