在 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
根据 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