关于数组:为什么JavaScript会以这种方式运行?

Why does JavaScript behave this way?

本问题已经有最佳答案,请猛点这里访问。

变量highScore = 0是否与循环分开?难道scores[i]不总是greater than 0吗?我需要有人来分解if语句是如何工作的,我需要理解highScore = scores[i]是如何将最高的数字返回给我的。这个练习在我正在阅读的一本书中,是为了学习JavaScript,而我只是觉得这已经超出了我的想象。有人能发光吗?谢谢您。

if语句如何在此代码中工作?如果highscore的值为0,那么highscore作为一个变量在if语句中的使用情况如何?突然输出值是数组中最高的数字似乎不符合逻辑。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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];
    }
}


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

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

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

现在,您不会得到最大的数字,它将警告值0,因为变量highScore声明为let,它将被视为块级范围而不是全局范围。演示在这里。因此,当您将警报置于for循环之外时,它将从全局作用域highScorevaribale获取值。

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


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

如果分数i'th指数大于高分(起始值为0),则将highScore重新分配给该值。

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

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

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

50比60高吗?不,因此,highScore的值保持在60。诸如此类。

编辑:

然而,您的代码是错误的,您正在范围内创建一个新的变量highScore。您需要重新分配初始变量。

因此,

highScore = scores[i];


var highScore您正在内部重新初始化

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

删除它将添加到全局highScore中的var


问题在于:

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

您只需将其更改为:

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

一切都应该工作得很好。


javascript工作得很好。您已初始化highScore两次。

这是变量的简单范围。

1
2
3
4
5
6
7
8
9
10
11
12
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(代替两个)。

希望这有帮助