首页 > 解决方案 > 声明变量时使用 var 和 not 有什么区别?

问题描述

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

标签: javascript

解决方案


请参阅删除运算符

任何用 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'))

看看用varhas声明的变量如何configurable: false,而隐式b赋值有configurable: true


推荐阅读