更改foreach循环内变量的值?使其在循环外可用

新手上路,请多包涵

我正在设置一个初始标志然后执行一个 foreach 将标志更改为不同的值但在 foreach 循环之外我仍然看到原始标志。仿佛什么都没有改变。但它确实在 foreach 循环内部发生了变化

该值仅在 foreach 循环内更改,但不会在其外部更改。

我看到了许多类似的问题,但它们都处理实际的数组值,在这种情况下,它是 foreach 循环之外的一个简单变量。

     var arr = ["one"];

    var str = 0;

    arr.forEach(function(part){

        if(part == 'one') {
            var str = 1;
            console.log('str changed to: ' + str);
        }

    })

    console.log('str is now: ' + str);

这将返回

str changed to: 1
str is now: 0

根据我上面的 PHP 逻辑应该返回“ str is now: 1 ”,为什么它的原始值是 0?

原文由 Robert Sinclair 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 583
2 个回答

这是因为您在循环中用 var 重新声明变量,而不是仅仅更新/设置它。重新声明它会从前一个循环迭代中清除较早的同名变量,并在更高范围的函数中隐藏该变量。它建立了一个新的,而不是仅仅更新现有的值。

 var arr = ["one"];
var str = 0;
arr.forEach(function(part){
 if(part == 'one') {
   str = 1;
   console.log('str changed to: ' + str);
 }
})

console.log('str is now: ' + str);

原文由 Scott Marcus 发布,翻译遵循 CC BY-SA 4.0 许可协议

问题是您要在 --- 中声明一个 的 --- forEach str 变量。只需放下 var

 var arr = ["one"];
var str = 0;

arr.forEach(function(part) {
  if (part == 'one') {
    str = 1; // Notice the lack of var
    console.log('str changed to: ' + str);
  }
});

console.log('str is now: ' + str);

原文由 Mike Cluck 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题