Node.js 没有浏览器式的全局作用域,所有用户代码运行在模块作用域内;var/let/const 声明的变量仅限当前模块,不自动挂载 global;需用 globalThis 显式访问或扩展全局属性。

在 Node.js 中,JavaScript 的全局作用域并不像浏览器那样直接映射到一个顶层作用域,而是通过 global 对象(或更推荐的 globalThis)来承载“可跨模块访问”的变量和函数。但关键在于:Node.js 没有真正的“全局作用域”,所有用户代码都运行在模块作用域内。
Node.js 里没有浏览器式的全局作用域
你在 .js 文件最外层用 var、let 或 const 声明的变量,只属于当前模块,不会自动挂到 global 上。这和浏览器中直接写 var a = 1 就等于 window.a = 1 完全不同。
-
console、process、setTimeout等能直接使用,是因为它们是global的属性(即global.console === console) -
__filename和__dirname看似“全局”,实则是每个模块独有的局部变量,不是 global 的属性 - 不加
var/let/const直接赋值(如abc = 123)会隐式创建 global 属性 —— 但这是严格模式下报错的行为,应绝对避免
如何正确访问或扩展全局对象
推荐统一使用 globalThis,它在 Node.js 和浏览器中都可用,且指向同一个对象(globalThis === global 在 Node.js 中为 true)。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 读取已有全局成员:
globalThis.console.log('ok')或直接console.log('ok') - 手动挂载自定义全局变量:
globalThis.myConfig = { port: 3000 },之后任何模块都能读取myConfig - 注意:挂载过多会污染命名空间,应优先考虑用
module.exports+require显式共享数据
常见误区澄清
很多人误以为 “在文件顶部声明就是全局”,其实 Node.js 的模块机制天然隔离了作用域:
立即学习“Java免费学习笔记(深入)”;
-
var x = 1→ 只在当前模块内有效,global.x为undefined -
global.x = 1或globalThis.x = 1→ 才真正在 global 上添加属性,其他模块可通过global.x访问 -
exports、require、module都不是 global 的属性,而是模块作用域的本地绑定
本质上,Node.js 把“全局作用域”变成了“全局对象的属性空间”,而代码执行环境始终是模块化的。理解这一点,才能写出可维护、不耦合的 Node 应用。

















