var a = 123;
b = 456;
console.log(window.a, window.b); // 123, 456
delete window.a; // true
delete window.b; // false
console.log(window.a, window.b); // 123, undefined
如果不使用var为什么不能删除全局变量?
答案 0 :(得分:12)
请参见delete operator:
用var声明的任何属性都不能从全局范围或函数的范围中删除。
使用时
b = 456;
解释器将其转换为
window.b = 456;
,即对window
对象上的属性的分配。但是a
是不同的-尽管它也会分配给window
对象上的属性,但它现在也是LexicalEnvironment
的一部分(而是而不只是对象的属性),因此无法通过delete
删除。
var a = 123;
b = 456;
console.log(Object.getOwnPropertyDescriptor(window, 'a'))
console.log(Object.getOwnPropertyDescriptor(window, 'b'))
看看用var
声明的变量如何具有configurable: false
,而隐式b
的赋值如何具有configurable: true
。