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

为何在JavaScript全局对象中执行delete this.x无法生效?

为什么全局对象中用var声明的x无法被delete删除?

这核心原因是用var声明的全局变量,会被设置成全局对象(浏览器里是window)的不可配置属性,而delete操作符只能删除configurable特性为true的属性。

具体拆解:

  • 当你在全局环境执行var x = 1时,JS引擎会在全局对象(window)上添加一个名为x的属性,但这个属性的特性被默认设置为:

    Object.getOwnPropertyDescriptor(window, 'x')
    // 返回:{ value: 1, writable: true, enumerable: true, configurable: false }
    

    重点就是configurable: false——这个特性决定了该属性不能被delete删除,也不能修改自身的特性(比如把configurable改成true)。

  • delete操作符的规则很明确:只有当目标对象的属性configurable为true时,删除操作才会生效。如果属性不可配置,非严格模式下delete会返回false(不会报错),严格模式下则直接抛出TypeError错误。

对比验证:

如果换一种方式给全局对象加属性,比如直接赋值:

window.x = 1;
console.log(Object.getOwnPropertyDescriptor(window, 'x').configurable); // true
delete window.x; // 删除成功
console.log(x); // 报错:x is not defined

这种方式创建的属性configurable是true,所以delete能正常生效。

另外,用let或const声明的全局变量,根本不会挂载到全局对象上,所以this.x(或window.x)根本访问不到它们,自然也不存在delete的问题。

内容的提问来源于stack exchange,提问作者ABHISHEK TIWARI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 08:36:29