node 的 global 与浏览器的 window 是不同运行环境的全局对象,不可互换;globalthis 是 es2020 提供的跨环境统一访问方案。

Node REPL 中的 global 和浏览器中的 window 都是各自环境的全局对象,但它们不是同一个东西,也不可互换——根本原因在于运行环境不同、设计目标不同、API 范围也不同。
global 是 Node 的“根容器”,不是模块作用域的一部分
在 Node REPL(或任意 .js 文件)中输入 global,你会看到一个巨大的对象,里面包含 setTimeout、console、process、__dirname 等属性。这些不是“挂上去”的,而是 Node 启动时就注入 global 的内置能力。
- 你在 REPL 里直接写
var a = 1,a不会自动变成global.a;Node 每个文件(包括 REPL 当前会话)默认是模块作用域,变量属于该模块,不污染 global - 但显式赋值如
global.b = 2或隐式声明如c = 3(未用 var/let/const),会让c成为global.c - 注意:
this在顶层 REPL 中指向 global,所以this.d = 4等价于global.d = 4
window 是浏览器专属的宿主对象,Node 里根本不存在
浏览器中 window 不仅是全局对象,还是 DOM 宿主环境的总入口。它封装了页面生命周期、用户交互、渲染上下文等能力。
ZenHeart zenlink 与 zenlink-mcp 为 OpenClaw,涵盖安装、MCP 注册、钩子接线、入站轮询及升级维护。
-
window.alert()、window.document、window.location这些 API 在 Node 中完全缺失,调用会报ReferenceError - 即使你在 Node 里手动定义
global.window = {},它也只是一个空对象,不具备任何浏览器行为 - 浏览器中
this === window(非严格模式),而 Node 中this === global,但两者结构、方法、语义完全不同
globalThis:统一访问方式的现代方案
ES2020 引入 globalThis,目的是让同一份 JS 代码能在浏览器、Node、Web Worker、Deno 等环境里安全获取全局对象,无需判断环境。
- 在浏览器中:
globalThis === window - 在 Node REPL 中:
globalThis === global - 写库或跨环境工具时,应优先用
globalThis替代硬编码window或global
常见误操作与验证技巧
快速区分当前环境并确认全局对象身份:
- 在 REPL 输入
console.log(global === this)→ 输出true - 在浏览器控制台输入
console.log(window === this)→ 输出true(非严格模式) - 尝试
global.document→ Node 中返回undefined,浏览器中报错(因为 global 不存在) - 尝试
window.setTimeout→ 浏览器中存在,Node 中报错ReferenceError: window is not defined










