javascript - JS窗口变量声明和行为
问题描述
我有两个以不同方式声明的全局变量。我认为由于它们都是窗口对象的属性,因此它们的行为应该相同。但事实并非如此。我只能删除其中一个,它被明确声明为窗口属性。由var运算符声明的那个不能被删除:
window.y1 = 'Y1';
"Y1"
var y2 = 'Y2';
undefined
y1;
"Y1"
y2;
"Y2"
window.y1;
"Y1"
window.y2;
"Y2"
delete window.y1;
true
delete window.y2;
false
我不清楚,为什么。你可以解释吗?
解决方案
var
全局对象上的 s 是不可配置的,这意味着它们不能被删除:
var y2 = 'foo';
console.log(
Object.getOwnPropertyDescriptor(window, 'y2')
);
行为符合预期。正如MDN所说:
任何用 var 声明的属性都不能从全局作用域或函数作用域中删除。
另一方面,默认情况下,将属性显式分配给对象确实会导致该属性是可配置的:
window.y2 = 'foo';
console.log(
Object.getOwnPropertyDescriptor(window, 'y2')
);