声明变量时使用var和不使用var有什么区别?

时间:2018-07-29 05:10:18

标签: javascript

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为什么不能删除全局变量?

1 个答案:

答案 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