【问题标题】:Problems reassigning a variable value while converting a for loop into a forEach loop将 for 循环转换为 forEach 循环时重新分配变量值的问题
【发布时间】:2018-06-22 04:53:59
【问题描述】:

我正在尝试将循环从 for 循环转换为遍历数组的 forEach 循环。循环的目的是找到数组中最大的数并返回最大的数。

当我尝试将其作为 for 循环执行但我似乎无法将其作为 forEach 循环执行时,它可以工作。有可能吗,如果可以,那怎么办?不然怎么办不了?

这是 for 循环,按我的意愿工作

 function getBig(x){
 var largeNumber = 0;
 var argue = x;
 for(i = 0; i < argue.length; i++){
    if(argue[i] > largeNumber){
            var largeNumber = argue[i];

        }
 }
 console.log(largeNumber);
 };

这是forEach

 function getBig(x){
    var largeNumber = 0;
    var argue = x;
    argue.forEach(function(theNumber){
        if(theNumber > largeNumber){
            var largeNumber = theNumber;
        }
    })
    console.log(largeNumber);
  };

我似乎遇到的麻烦是更改 forEach 中变量的值。怎么改?

【问题讨论】:

  • 这与 var largeNumber = argue[i]; 的范围有关 - 不要在 forEach 中使用 var 作为该变量名,它会使用外部范围的变量名
  • 嗨 Jaromanda,谢谢你的提示! :)

标签: javascript arrays loops foreach


【解决方案1】:

vars 被提升并具有函数范围,而不是块范围。对于解释器,您的原始代码如下所示:

function getBig(x){
  var largeNumber;
  largeNumber = 0;
  var argue = x;
  for(i = 0; i < argue.length; i++){
    if(argue[i] > largeNumber){
      largeNumber = argue[i];

    }
  }
  console.log(largeNumber);
};

在您的forEach 中,largeNumber 被提升到最近函数的顶部,这与getBig 函数不同。为了清楚起见,我们称它为largeNumber2 - 对于解释器来说,它看起来像这样:

function getBig(x){
  var largeNumber = 0;
  var argue = x;
  argue.forEach(function(theNumber){
    var largeNumber2;
    if(theNumber > largeNumber2){
      largeNumber2 = theNumber;
    }
  })
  console.log(largeNumber);
};

它是一个单独的变量,绑定到forEach 的内部,并且在外部不可见。尝试将其分配给外部作用域中的largeNumber,而不是在内部函数中不使用var

function getBig(x){
  var largeNumber = 0;
  var argue = x;
  argue.forEach(function(theNumber){
    if(theNumber > largeNumber){
      largeNumber = theNumber;
    }
  })
  console.log(largeNumber);
}
getBig([2, 3, 4, 1, 2]);

还要注意,函数的最后一个括号后不应有分号。您的功能可以简化为:

const getBig = arr => console.log(Math.max(...arr));
getBig([2, 3, 4, 1, 2]);

【讨论】:

  • 感谢您的帮助,非常感谢您的解释。
【解决方案2】:

for 中,您将 largeNumber 创建为全局变量,方法是仅在全局上下文中使用 var 声明它。因此,当您在循环后再次访问 largeNumber 时,它会为您提供正确的值。

forEach 中,您正在使用 var 在函数中创建 largeNumber,该函数仅限于函数的范围。

对于forEach,去掉var声明,就可以正常工作了:

largeNumber = theNumber

【讨论】:

    猜你喜欢
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    相关资源
    最近更新 更多