为何在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
相关产品推荐
相关产品推荐

