这是否意味着,在 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.clearInterval。 global.clearInterval 可以在任何地方看到,因此具有全局范围。将全局对象的属性称为全局变量是否正确?
是的,主要是。也就是说:全局对象的属性是全局变量,但 JavaScript 实际上有 两种 种全局变量:一种是全局对象的属性,另一种不是。在全局范围内,var 和 function 声明创建作为全局对象属性的全局变量,但 let、const 和 class 声明创建不是的全局变量全局对象的属性。
使用全局对象的全局环境是“外部”全局环境。在全局范围内使用let、const 和class 声明创建的标识符是“内部”全局环境。这意味着let/const/class globals 会影响全局对象上的全局变量,就像函数中的局部变量会影响函数外部声明的变量一样。
旁注:注意global 是一个特定于 Node.js 的全局变量,在大多数其他 JavaScript 环境中不存在。 ES2020 添加了一个新的预定义全局 globalThis,它与 this 在全局范围(传统上指的是全局对象)中的值相同,它取代了 Node.js 的 global。