【问题标题】:calling a function in for loop giving infinite loop but same works fine in while loop在 for 循环中调用一个函数会产生无限循环,但在 while 循环中同样可以正常工作
【发布时间】:2020-09-25 19:05:40
【问题描述】:

所以我正在研究一个函数,它将任何东西作为参数,控制台将它记录在一个盒子或一个单元格中。这就是我想出的:

var horiz='━';
var vert='┃';
var ulcor='┏';
var urcor='┓';
var blcor='┗';
var brcor='┛';

//create a cell/box
var cell=(d='')=>{
    let h='';
    if(d==undefined||d==null){
        throw('cell needs an argument');
    }
    len=d.toString().length;
    for(i=0;i<3;i++){
        if(i==0){
            for(j=0;j<len;j++){
                h+=horiz;
            }
            if(i==0) console.log(ulcor+h+urcor);
        }
        if(i==1){
            console.log(`${vert}${d}${vert}`);
        }
        if(i==2){
           console.log(blcor+h+brcor);    
        }
    }
}

现在当我测试这个时,我做了以下操作

cell('index');
cell(1);

给出以下输出:

┏━━━━━┓
┃index┃
┗━━━━━┛
┏━┓
┃1┃
┗━┛

并且还进行了其他测试,并且在我进行以下测试之前效果很好:

for(i=0;i<5;i++){
   cell(i)
}

上面的代码应该给我带有1,2,3,4 的单元格/框,但是这给了我一个无限循环,我注意到它只打印了 4 个(不是 1,2 或 3)但无限次的单元格。

现在是有趣的部分。当我执行以下操作时:

n=1;
while(n<10){
  cell(n);
  n+=1;
}

上面的代码给出了预期的结果并且工作正常。 诡异的!!只是无法弄清楚为什么当我在for loop 中使用它时它会无限运行,但while loop 效果很好。如果代码中需要任何改进,请务必提及:)

【问题讨论】:

  • 你在for循环版本中使用了全局变量i。
  • JS 中的变量应始终使用 let 或 const 定义。尤其是在 for 循环中 for (let i = 0; ...
  • 在严格模式下运行您的代码,它应该会告诉您您遇到的编码问题。如果您不了解严格模式,请read 了解它。您的代码在“草率模式”下运行,而您为此付出了代价。

标签: javascript node.js loops for-loop while-loop


【解决方案1】:

当您声明一个没有var、let 或const 关键字的变量时,该变量就是implicit global。在您的cell 函数中,您使用for(i=0;i&lt;3;i++),其中i 声明时没有关键字。

您的循环调用 for(i=0;i&lt;5;i++){ cell(i) } 也使用了 i 没有关键字,这使得 i 引用相同的全局变量。因此,您的 call 函数实际上是在函数内部操作 i,这使得 for 循环以意想不到的方式运行。 while 循环使用不同的变量 n,这就是它没有同样问题的原因。

尝试将call 中的for 循环更改为for(let i = 0; i &lt; 3; i++) 以限制i 的范围。而且,一般来说,使用let and const to declare ALL variables,甚至(尤其是)for 循环中的那些。

【讨论】:

    猜你喜欢
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多