【问题标题】:What does global scope means in client-side Javascript that runs inside web browser全局范围在 Web 浏览器内运行的客户端 Javascript 中意味着什么
【发布时间】:2021-07-23 13:38:37
【问题描述】:

根据 MDN:

在客户端 JavaScript 中,全局范围通常是所有代码都在其中执行的网页。

现在由于 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 必须在 test.html 加载时创建并初始化为 undefined,因此 alert(g)在 test2.js 中应该提醒 undefined。

【问题讨论】:

    标签: javascript scope hoisting


    【解决方案1】:

    这与范围无关。这是关于时间的。

    每个&lt;script&gt; 都会在解析时执行。

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

    【讨论】:

    • 感谢您的回复。所以全局变量被提升到定义它们的
    • @pixo 文件按照它们出现的顺序进行解析。它不是部分做的,与提升无关。
    • @epascarello 谢谢。所以gs 声明仅在浏览器解析第二个&lt;script&gt;g 中定义的
    【解决方案2】:

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

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

    【讨论】:

    • @epascarello 这已经完成了。
    猜你喜欢
    • 2015-10-08
    • 2011-09-18
    • 2016-09-07
    • 2012-09-10
    • 2021-08-20
    • 2012-03-14
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    相关资源
    最近更新 更多