在while循环中无法访问全局变量

时间:2019-06-25 18:12:09

标签: javascript arrays while-loop

我正在尝试解决此编程问题,但无法在while循环内访问全局变量。当我访问全局变量时,它使我不确定。

function equal(h1, h2, h3) {
  let sum1 = 0;
  let sum2 = 0;
  let sum3 = 0;
  let first = [];
  let second = [];
  let third = [];
  let count = 0;
  while (h1.length !== 0) {
    var popped = h1.pop();
    sum1 += popped;
    first.push(popped);
  }
  while (h2.length !== 0) {
    var popped = h2.pop();
    sum2 += popped;
    second.push(popped);
  }
  while (h3.length !== 0) {
    var popped = h3.pop();
    sum3 += popped;
    third.push(popped);
  }
  while (sum1 === sum2 && sum2 === sum3 && sum3 === sum1) {
    // Below two consoles are not printing anything.
    console.log(sum1, sum2, sum3);
    console.log(h1, h2, h3);
    if (sum1 > sum2) {
      var x = first.pop();
      sum1 = sum1 - x;
    } else if (sum2 > sum3) {
      var y = second.pop();
      sum2 = sum2 - y;
    } else {
      var z = third.pop();
      sum3 = sum3 - z;
    }
  }
}

console.log(equal([3, 2, 1, 1, 1], [4, 3, 2], [1, 1, 4, 1]));

2 个答案:

答案 0 :(得分:1)

您没有从方法equal()返回任何内容。因此,如果您尝试对其进行控制台,它将显示undefined。请尝试返回一些值。


已附加代码段(已编辑)

function equal(h1, h2, h3){
    let sum3 = 0;
    let third = [];
    let count = 0;
    while (h3.length !== 0){
        var popped = h3.pop();
        sum3 += popped;
        third.push(popped);
        //here are the global variables inside while loop
        console.log(sum3)
    }
}

console.log(equal([ 3, 2, 1, 1, 1 ], [ 4, 3, 2 ], [ 1, 1, 4, 1 ]));

答案 1 :(得分:1)

一些定义

Global Variables and Scope

Lexical Scope


一些误解

1。误解什么是全局变量。

可以在函数的lexical scope中访问变量,并按从本地范围到父范围再到全局范围(浏览器中的window,nodejs中的global)的顺序对其进行评估。您所说的“全局范围”实际上是equal函数或while循环的局部范围。

2。期望从equal返回值而没有返回语句

console.log(equal([3, 2, 1, 1, 1], [4, 3, 2], [1, 1, 4, 1]));

equal不返回任何内容,因此不会将任何内容记录到控制台。

3。误解了JavaScript的评估方式

JavaScript同步评估代码(有关更多信息,请阅读this)。因此,您的while循环将按顺序进行评估,一次一次,直到它们评估的每个数组的长度变为0。然后将评估您最后的while循环。

while(sum1 === sum2 && sum2 === sum3 && sum3 === sum1)

仅当所有3个条件都为真时,此循环才会迭代。像您一样调用equal

equal([3, 2, 1, 1, 1], [4, 3, 2], [1, 1, 4, 1])

将导致最后的while循环为假(这是伪代码):

sum1 = (3 + 2 + 1 + 1 + 1) = 8 
sum2 = (4 + 3 + 2) = 9 
sum3 = (1 + 1 + 4 + 1) = 7
---
sum1 != sum2 && sum2 != sum3 && sum3 != sum1

因此不会发生迭代,并且不会在最终console.log(sum1, sum2, sum3)循环中打印while