在 Web 浏览器内运行的客户端 Javascript 中,全局范围意味着什么

What does global scope means in client-side Javascript that runs inside web browser

根据 MDN:

In client-side JavaScript, the global scope is generally the web page inside which all the code is being executed.

现在由于在 HTML 网页加载时提升(即全局范围的开始),所有全局变量都应创建并初始化为 undefined

为了对此进行测试,我创建了三个文件:

test.html:

<html>
<head>
</head>
<body>
<script src = "test2.js"></script>
<script src = "test1.js"></script>
</body>
</html>

test2.js:

alert(g); // ReferenceError: g is not defined (web browser console)
function increment()
{
    g = g + 1;
}

test1.js:

var g = 1;
increment();
alert(g); // alert's 2

为什么 test2.js 中的 alert(g) 会导致 ReferenceError?为什么 g 的声明没有提升到全局范围的开头?

我认为 g 的声明没有提升到全局范围的开头,因为如果是,那么 g 必须已经创建并初始化为 undefined 当 test.html 加载,因此 test2.js 中的 alert(g) 应该警告未定义。

这与范围无关。这是关于时机。

每个 <script> 将在解析时执行。

在后续脚本中定义的变量虽然会出现在同一范围内,但不会提升,因此它们在前一个脚本运行时存在。

如果变量不在函数范围内,则标签或脚本文件 (XXX.js) 内的所有变量都是全局变量。如果您希望变量是全局的,则在定义变量时不要添加全局词或其他任何内容。

在这种情况下你需要先定义变量然后调用它们,在JS语言中,机器首先逐行解析所有代码,当完成第一个Js文件时再去解析到另一个文件。当编译器查看 test2.js 时没有找到任何变量,因为该变量将在 test2.js 解析后定义为 test1.js