You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js v18.4.0严格模式下var全局变量声明与删除问题

现象产生原因
  • Node.js 中所有 .js 代码文件默认运行在独立的模块作用域下,而非浏览器环境那样的全局作用域。你在代码顶层用 var/let/const 声明的变量,都属于当前模块私有的作用域绑定,不会自动挂载到 globalThis/global 全局对象上,这也是你代码里 globalThis.x、global.x 始终为 undefined 的核心原因。
  • var 声明的变量会在当前作用域创建不可配置的绑定,本身就无法通过 delete 操作删除。你代码里执行的 delete globalThis.x、delete global.x 操作,本质是在删除全局对象上本来就不存在的属性,删除不存在的对象属性会默认返回 true,全程没有触碰模块作用域里声明的 x,所以 x 的值始终为 1。严格模式下删除不可配置的属性会抛出错误,但由于你操作的全局对象上本就不存在 x 属性,所以不会触发报错,返回结果符合JS语法规则。
  • 补充说明:只有在 Node.js 的 REPL 交互环境中,顶层声明的 var 才会被特殊处理挂载到全局对象,常规模块文件运行时不会有这个行为。严格模式下禁止隐式创建全局变量,未声明直接赋值会抛出 ReferenceError。
可删除全局变量的正确实现方式

你需要的可删除全局变量,本质是挂载到全局对象上的可配置属性,不要通过变量声明关键字创建,直接显式给全局对象赋值即可:

"use strict";
// 显式挂载属性到全局对象
globalThis.x = 1;

// 作用域链查找时会自动从全局对象读取该属性
console.log("x", x); // 输出 x 1
console.log("globalThis.x", globalThis.x); // 输出 globalThis.x 1

// 直接删除全局对象上的属性即可
console.log("delete globalThis.x", delete globalThis.x); // 输出 delete globalThis.x true
console.log("globalThis.x", globalThis.x); // 输出 globalThis.x undefined
// 此时再直接访问x会抛出ReferenceError,因为全局对象上已经不存在该属性

注意:这种方式创建的不是严格意义上的变量声明,而是全局对象的属性,因此删除后再访问会触发未定义错误,符合可删除的需求。所有通过 var/let/const 关键字声明的变量,天生带有不可配置特性,永远无法被 delete 删除。

内容的提问来源于stack exchange,提问作者An old man in the sea.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 15:09:46