【问题标题】:Why does JavaScript behave this way? [duplicate]为什么 JavaScript 会这样? [复制]
【发布时间】:2017-12-21 07:47:15
【问题描述】:

var highScore = 0 是循环的一部分吗? scores[i] 不总是greater than 0 吗?我需要有人来分解 if 语句的工作原理,并且我需要了解 highScore = scores[i] 是如何将最高数字返回给我的。这个练习是在我正在阅读的一本学习 JavaScript 的书中,我只是觉得它太过分了。任何人都可以阐明吗?谢谢。

if 语句在这段代码中是如何工作的?如果它的值是 0,highScore 甚至与 if 语句中使用的变量有什么关系?它突然输出的值是数组中的最高数似乎不合逻辑。

var scores = [60, 50, 60, 58, 54, 54, 58, 50, 52, 54, 48, 69, 34, 55, 51, 52, 44, 51, 69, 64, 66, 55, 52, 61, 46, 31, 57, 52, 44, 18, 41, 53, 55, 61, 51, 44];

var highScore = 0;

for (i = 0; i < scores.length; i++) {

    output = "Bubble #: " + i + " scores: " + scores[i];

    console.log(output);

    if (scores[i] > highScore){
        var highScore = scores[i];
    }
}

【问题讨论】:

  • 提示:你在声明两个变量highScore??

标签: javascript arrays


【解决方案1】:

问题出在这里:

    if (scores[i] > highScore){
    **var highScore = scores[i];**
}

您只需将其更改为:

    if (scores[i] > highScore){
        highScore = scores[i];
}

一切都应该完美运行。

【讨论】:

  • 不做这个改变也可以工作。
  • @SureshPonnukalai 给出了你的答案
  • 我已经给出了答案。 @Nimrod 提到问题出在var highScore=score[i]; 行。这是错误的。
【解决方案2】:

var highScore你又在里面初始化了

if (scores[i] > highScore){
    var highScore = scores[i];
}

删除 var 它将添加到全局 highScore

【讨论】:

  • 所以你想说当前代码不会将它添加到全局范围???
  • @Suresh 不会,您正在另一个范围内创建一个新变量,并且它永远不会重新分配。
  • 我知道它永远不会重新分配。但我想说的是,如果您使用相同的名称创建它,它将覆盖当前的。
【解决方案3】:
if (scores[i] > highScore){
    var highScore = scores[i];
}

如果第 i 个索引的分数大于 highScore(开始为 0),则将 highScore 重新分配给该值。

所以本质上,假设数组的第一个索引高于 0,因为它是 60 - 这是新的高分。

然后,在索引 1 处,即 50,再次运行:

if (scores[i] > highScore){
    var highScore = scores[i];
}

50 比 60 高吗?不,因此,highScore 的值仍为 60。依此类推。

编辑:

无论您的代码有什么问题,您都在范围内创建了一个新变量highScore。您需要重新分配初始变量。

因此,

highScore = scores[i];

【讨论】:

  • 哇,这完全超出了我的想象,作为 JavaScript 的新手,我花了将近 2 个小时试图弄清楚这一点。谢谢你的解释,这对我来说很难。您对我如何更好地学习有什么建议吗?
  • 你还需要初始化i。所以,var i = 0;,除此之外应该没问题:)
  • 似乎在 if 语句中发生了很多事情。有点让我吃惊
  • 婴儿步。现在看起来很多,过一段时间你会发现它是儿童游戏:)
【解决方案4】:

我认为您对变量的范围感到困惑。如果您在程序中的任何地方使用关键字var 声明变量,它将被视为全局范围。这意味着您可以在程序的任何地方访问更新的值。这就是为什么它在 for 循环执行后给出最高数字作为输出。由于这个原因,您的代码可以正常工作。DEMO HERE。您可以看到输出 69 作为警报。假设在您的代码中,如果您将代码更改为

   if (scores[i] > highScore){
    var highScore = scores[i];
   }

   if (scores[i] > highScore){
    let highScore = scores[i];
   }

现在你不会得到最大的数字,它会提醒值0,因为变量highScore 声明为let,它将被视为块级范围而不是全局范围。 DEMO HERE。因此,当您将 alert 放在 for 循环之外时,它会从全局范围 highScore varibale 中获取值。

我希望你现在可以很容易地理解 if 条件是如何工作的。

【讨论】:

  • 你认为“让”能让你更新高分吗?
  • 我给出的解释与范围有关。因为代码已经按照他的预期工作了。
【解决方案5】:

Javascript 运行良好。 你已经初始化了两次highScore

这是变量的简单范围。

var highScore = 0; 

    for (i = 0; i < scores.length; i++) {

        output = "Bubble #: " + i + " scores: " + scores[i];

        console.log(output);

        if (scores[i] > highScore){
            var highScore = scores[i]; // ---- (2)
        }
    }

当您使用var 声明变量时,它将成为一个全局变量,这就是您获得数组最大值的原因。

尝试使用具有块作用域的let(代替两个)

希望对你有帮助

【讨论】:

  • 如果你使用 let 你不会得到数组的最高编号
猜你喜欢
  • 2019-05-20
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-19
  • 2021-02-20
  • 1970-01-01
相关资源
最近更新 更多