我有两个声明不同的全局变量。我以为,由于它们都是窗口对象的属性,因此它们的行为应该相同。但事实并非如此。我只能删除其中之一,即明确声明为window属性的内容。 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是不可配置的,这意味着它们不能被删除:



var y2 = 'foo';
console.log(
  Object.getOwnPropertyDescriptor(window, 'y2')
);





行为符合预期。正如MDN所说:


  用var声明的任何属性都不能从全局范围或函数的范围中删除。


另一方面,将属性显式分配给对象的确会导致该属性可配置,默认情况下:



window.y2 = 'foo';
console.log(
  Object.getOwnPropertyDescriptor(window, 'y2')
);

关于javascript - JS窗口变量的声明和行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50791360/

10-11 23:53