【问题标题】:JavaScript Scope : please explain me why different result in and of loop creating variableJavaScript 范围:请解释为什么循环创建变量的结果不同
【发布时间】:2017-09-11 21:27:27
【问题描述】:

你能解释一下为什么我会得到不同的结果吗?

这是完成的代码和我想要的结果:

function largest_of_arrs(arr){
  var largest_arr = [];
  var holder;
  var max = 1;
  for(var i = 0; i < arr.length; i++){
    var sum = 0;
    for(var j = 0; j < arr[i].length; j++){
      sum += arr[i][j];
      if(sum > max) {
        max = sum;
        largest_arr  = arr[i];
      }
    }
  }
  return largest_arr;
}

var array_1 = [[1,2,3,4,5],[1,2,2,3,1],[11,12,23,45,88],[20,20,5,5,1]];
largest_of_arrs(array_1);

这给了我想要的结果:[11,12,23,45,88]

但是当我像这样在 for 循环之外声明 sum 变量时

function largest_of_arrs(arr){
  var largest_arr = [];
  var holder;
  var max = 1;
  var sum = 0;
  for(var i = 0; i < arr.length; i++){

    for(var j = 0; j < arr[i].length; j++){
      sum += arr[i][j];
      if(sum > max) {
        max = sum;
        largest_arr  = arr[i];
      }
    }
  }
  return largest_arr;
}

var array_1 = [[1,2,3,4,5],[1,2,2,3,1],[11,12,23,45,88],[20,20,5,5,1]];
largest_of_arrs(array_1);

结果是:[20,20,5,5,1]

您能否向我解释一下为什么?以及如何在此处设置范围? 如果可能,请提供图片(图形)..

【问题讨论】:

  • 因为在您的真实情况下,您在第一次迭代的开头设置了sum=0。所以成像总和在每个 i 处为 0,而在后者中,它只是累积;)
  • @Levo96 搜索你的逻辑失败就像在数学中 3+2*5 和 (3+2)*5 不一样

标签: javascript arrays for-loop scope


【解决方案1】:

你能解释一下为什么吗?

在第一种情况下,您在外循环的每次迭代中将 sum 的值重置为零。在第二种情况下,你不那么 sum 只是不断积累。

这里的范围如何工作?

var 声明的变量具有函数作用域(如果全局声明,则为全局变量)。您的问题与范围无关,这是因为您将 0 分配给 sum 的位置。

如果可能,请提供图片(图形)

抱歉,没有图片。 :-(

【讨论】:

    【解决方案2】:
    First Case - 
    i=0
      sum = 0;
      j iterates till end of loop 
      sum = 1+2+3+4+5;
    i=1
      sum = 0;
      j iterates till end of loop 
      sum = 1+2+2+3+1;
    i=2
      sum = 0;
      j iterates till end of loop 
      sum = 11+12+23+45+88;
    ....
    
    Second Case - 
    i=0
      sum = 0;
      j iterates till end of loop 
      sum = 1+2+3+4+5;
    i=1
      sum = 1+2+3+4+5;
      j iterates till end of loop 
      sum = (1+2+3+4+5)+1+2+2+3+1;
    i=2
      sum = ((1+2+3+4+5)+1+2+2+3+1);
      j iterates till end of loop 
      sum = ((1+2+3+4+5)+1+2+2+3+1)+11+12+23+45+88;
    ...
    

    【讨论】:

      【解决方案3】:

      for 语句没有在 javascript 中定义范围,只有函数可以(根据 ES5)。 您的问题是因为您将0 分配给sum 的那一刻:在外部for 内部。

      【讨论】:

      • 注意 ES6 引入的差异:for 语句支持使用 let 定义的变量的本地范围(每个循环迭代都有单独的环境记录)。用大括号括起来的块语句也在本地范围内使用let 定义的内部变量。
      猜你喜欢
      • 2013-08-30
      • 1970-01-01
      • 2010-11-11
      • 2011-09-08
      • 2011-09-16
      • 2016-01-14
      • 2012-06-12
      • 1970-01-01
      相关资源
      最近更新 更多