【问题标题】:Are the following examples of global variables?以下是全局变量的例子吗?
【发布时间】:2020-07-11 20:19:34
【问题描述】:

我知道全局变量是具有全局范围的变量。我知道全球范围意味着它可以被所有人看到。这是否意味着,在node.js 中,这里的n 是一个全局变量?

let n = 1

function f() {}
...

我还读到全局变量可以定义为全局对象的属性,例如global.clearIntervalglobal.clearInterval 可以在任何地方看到,因此具有全局范围。将全局对象的属性称为全局变量是否正确?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    这是否意味着,在 node.js 中,n 这里是一个全局变量?

    这取决于你如何运行它。默认情况下,不会,因为 Node.js 将您的代码视为 模块,而不是 脚本。模块中的顶级声明不是全局的,它们的作用域是模块。

    如果您将该代码作为脚本运行,那么n(和f)将是全局变量(尽管有趣的是,它们是不同的种类 全局变量;更多内容见下文)。使用 Node.js,您可以通过将代码直接提供给 Node.js 来在全局范围内运行代码,而不是给它一个文件来执行。所以如果你有:

    file.js:

    function f() { }
    console.log(global.f === f);
    

    你这样做:

    节点文件.js

    您会看到false,因为f 不是全局变量。但如果你这样做:

    节点 -e "函数 f() { } console.log(global.f === f);"

    您会看到true,因为您在-e ("eval") 选项中传递的代码是在全局范围内执行的。 (您也可以通过将文件重定向到 node 而不是让 node 直接读取文件:node < file.js 来从文件中执行此操作。)

    请注意,n 无论如何都不是global 的属性,因为它是一种不同的全局属性。

    我还读到,全局变量可以定义为全局对象的属性,例如global.clearIntervalglobal.clearInterval 可以在任何地方看到,因此具有全局范围。将全局对象的属性称为全局变量是否正确?

    是的,主要是。也就是说:全局对象的属性是全局变量,但 JavaScript 实际上有 两种 种全局变量:一种是全局对象的属性,另一种不是。在全局范围内,varfunction 声明创建作为全局对象属性的全局变量,但 letconstclass 声明创建不是的全局变量全局对象的属性。

    使用全局对象的全局环境是“外部”全局环境。在全局范围内使用letconstclass 声明创建的标识符是“内部”全局环境。这意味着let/const/class globals 会影响全局对象上的全局变量,就像函数中的局部变量会影响函数外部声明的变量一样。


    旁注:注意global 是一个特定于 Node.js 的全局变量,在大多数其他 JavaScript 环境中不存在。 ES2020 添加了一个新的预定义全局 globalThis,它与 this 在全局范围(传统上指的是全局对象)中的值相同,它取代了 Node.js 的 global

    【讨论】:

    • 谢谢。因此,如果let n = 1 在控制台上,它会被视为全局变量,因为它被视为脚本?
    • @tonitone111 - 如果您指的是 Node.js 控制台 (REPL),是的。它是一个全局对象,不是全局对象的属性。 var n = 1; 将是一个全局对象,全局对象的属性。
    • 对不起,我指的是浏览器中的控制台标签
    • 为什么全局变量很重要,它们有什么作用?如果它们只是可以在它们所在文件中的任何位置访问的变量,为什么 let n 在我的文本编辑器中不被视为全局变量,即使文件中的任何地方都可以看到它?跨度>
    • @tonitone111 - 全局变量的价值在于它可以在任何地方访问,而不仅仅是在它所在的文件中。parseInt 是一个全局变量,例如 @ 也是987654357@。过去,如果您希望其他脚本能够访问某些内容(例如,jQuery 中的 $ 或 Underscore/lodash 中的 _),您必须将其设为全局。但这会导致冲突(比如几年前 jQuery 和 PrototypeJS 之间的冲突)。通常,您希望避免使用全局变量,而 JavaScript 在过去几年中已经获得了使之成为可能的功能(最值得注意的是:模块)。
    猜你喜欢
    • 1970-01-01
    • 2017-04-26
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    相关资源
    最近更新 更多