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.
相关产品推荐
相关产品推荐

