【问题标题】:Can't access global variable in while loop无法在while循环中访问全局变量
【发布时间】:2019-11-07 15:12:46
【问题描述】:

我正在尝试解决这个编程问题,但我无法访问 while 循环内的全局变量。当我访问全局变量时,它给了我 undefined。

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]));

【问题讨论】:

  • 你的函数没有返回任何东西,所以console.log 将打印“未定义”。
  • 我的意思是,当我在内部访问 console.log(sum1, sum2, sum3) 或 console.log(h1, h2, h3) 时,它会打印 undefined。
  • @devesh 这些都不是全局变量,它们都是函数的局部变量。
  • 你永远不会到达那些console.log 行,因为while 条件不正确。
  • sum1 == 8, sum2 == 9, sum3 == 7,所以你永远不会进入while循环。

标签: javascript arrays while-loop


【解决方案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 ]));

【讨论】:

  • 这是对的,但它与在while循环中访问全局变量有什么关系?
  • 他的评论说 当我在里面访问 console.log(sum1, sum2, sum3) 或 console.log(h1, h2, h3) 时,它会打印 undefined
  • @Barmar 我们可以在 while 循环中访问全局变量,我已经更新了我的答案,在代码 sn-p 中,您可以看到正在打印的全局变量。
【解决方案2】:

一些定义

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

因此不会发生迭代,并且您的最终 while 循环内的 console.log(sum1, sum2, sum3) 将不会被打印。

【讨论】:

    猜你喜欢
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 2014-01-17
    • 2014-04-08
    相关资源
    最近更新 更多