JavaScript For Loop保持无限循环

JavaScript For Loop保持无限循环,javascript,for-loop,Javascript,For Loop,我编写了下面的函数,作为一个更大的应用程序的一部分,用于通过web界面处理FASTA格式的文件。出于某种原因,当从makePretty()中调用我的baseCounts()函数时,它决定运行到无穷大。可能值得注意的是,这两个函数都由相同的父函数封装 函数baseCounts()以100+长数组的形式返回有效数据,console.log确认这不是问题所在,因此问题在于makePretty() 欢迎任何帮助 函数基本计数(记录){ //计算数组中基的实例数 var basecounts=Array

我编写了下面的函数,作为一个更大的应用程序的一部分,用于通过web界面处理FASTA格式的文件。出于某种原因,当从makePretty()中调用我的baseCounts()函数时,它决定运行到无穷大。可能值得注意的是,这两个函数都由相同的父函数封装

函数baseCounts()以100+长数组的形式返回有效数据,console.log确认这不是问题所在,因此问题在于makePretty()

欢迎任何帮助

函数基本计数(记录){
//计算数组中基的实例数
var basecounts=Array();
对于(i=0;i}
您的嵌套循环使用相同的变量
i
,并相互碰撞对方的状态

        for (i=0; i < records.length; i++){
            ...
            for (i=0; i < count.length; i++){
                ...
            }
for(i=0;i
使用不同的变量,比如
i
j
,或者更好地选择有意义的名称

您还应该声明变量(
var i
),以确保它们是函数的本地变量


最后,使用
++i
,而不是
i++
。前者表示“增量i”,而后者表示“i,顺便说一下,还有oh”。它们都递增
i
,但后者返回旧值,这是一种特殊情况下使用的特殊语言功能。

您的嵌套循环使用相同的变量
i
,并相互碰撞对方的状态

        for (i=0; i < records.length; i++){
            ...
            for (i=0; i < count.length; i++){
                ...
            }
for(i=0;i
使用不同的变量,比如
i
j
,或者更好地选择有意义的名称

您还应该声明变量(
var i
),以确保它们是函数的本地变量


最后,使用
++i
,而不是
i++
。前者表示“增量i”,而后者表示“i,顺便说一句,还有oh”。它们都是增量
i
,但后者返回旧值,这是一种特殊情况下使用的特殊语言功能。

您正在重置内部循环中的变量计数器(i)

为了避免这种情况,以及将来的类似问题以及吊装问题,我建议使用更新的函数,如forEach或map。您也可以通过以下方式清理代码:

function baseCountFunc(records){
  // Count instances of Bases in array
  var basecount = [];
  records.forEach(function(record) {
    var count = [record.match(/A/g), record.match(/T/g), record.match(/C/g), record.match(/G/g)];
    count.forEach(function(countElement) {
      basecount.push(countElement.length);
    });
    basecounts.push(basecount);
  });
}

另外,我注意到您将函数命名为与变量相同的名称,您也应该避免这种情况。

您正在重置内部循环(I)中的变量计数器

为了避免这种情况,以及将来的类似问题以及吊装问题,我建议使用更新的函数,如forEach或map。您也可以通过以下方式清理代码:

function baseCountFunc(records){
  // Count instances of Bases in array
  var basecount = [];
  records.forEach(function(record) {
    var count = [record.match(/A/g), record.match(/T/g), record.match(/C/g), record.match(/G/g)];
    count.forEach(function(countElement) {
      basecount.push(countElement.length);
    });
    basecounts.push(basecount);
  });
}

另外,我注意到您将函数命名为与变量相同的名称,您也应该避免这种情况。

您可以演示一下如何创建此错误吗?使用相同变量名称的嵌套循环会遇到各种各样的问题(无论如何,您都应该用'var'声明)。在JS中,这些函数的作用域是最近的函数,而不是闭包。内部循环使用不同的字母。您能演示一下如何创建此错误吗?使用相同变量名的嵌套循环会遇到各种各样的问题(无论如何,您都应该用'var'声明)在JS中,这些函数的作用域是最近的函数,而不是闭包。内部循环使用不同的字母。在99.99%的情况下,您肯定希望迭代器在循环执行一次后递增。除此之外,您还可以点击.edit-第三条语句在循环之后执行(@Sam)但是没有真正的理由将其更改为++i。@无论是++i还是i++,Antiga i都将在循环后递增,因此任何一个都可以工作。直到循环中的块运行一次,才会执行increment语句。在99.99%的情况下,您肯定希望迭代器在循环执行一次后递增。除了在,您的位置是.edit-第三条语句在循环之后执行(@Sam),但没有真正的理由将其更改为++i。@无论是++i还是i++,Antiga i都将在循环之后递增,因此任何一条都有效。直到循环中的块运行一次,才会执行递增语句。