delete关键字在全局变量上的不同行为
Different behaviour of delete keyword on global variables
请考虑以下片段(此处为fiddle):
var a;
a = 1;
console.log(delete a); // prints 'false'
b = 1;
console.log(delete b); // prints 'true'
为什么delete
关键字在全局变量a
和b
上表现不同?
来自MDN文档:
delete运算符从对象中删除特性。
全局变量(不带var
)是全局对象(通常为window
)上的属性,因此可以删除。
var
不是全局变量,而是外部作用域中的局部变量-不是全局对象的属性-因此delete
不会删除它
x = 42; // creates the property x on the global object
var y = 43; // declares a new variable, y
delete x; // returns true (x is a property of the global object and can be deleted)
delete y; // returns false (delete doesn't affect variable names)
MDN表示,只有当属性存在且无法删除时,delete才会返回false。在所有其他情况下都返回true。删除后,请尝试测试实际值。您将看到a
未被删除。这是因为,正如MDN页面所说,delete
不会影响变量名。
它对变量或函数名没有影响。
(即,用var
定义,而不是离开全局对象)
请看下页的示例。https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/delete
来自mozilla文档关于var:
不同之处在于,声明的变量是全局对象的不可配置属性,而未声明的是可配置的
var a;
-->这是一个已声明的变量,因为您使用的是var
,所以它是不可配置的。
a = 6;
-->这是一个未声明的变量,因为您没有使用var
,所以它是可配置的。
上面的两个语法最终都会附加一个名为a
的var作为全局对象的属性(通常为window
),并且属性具有以下属性:
- 可写。如果为false,则无法更改属性的值
- 可配置。如果为false,则任何删除属性或更改其属性(可写、可配置或可枚举)的尝试都将失败
- 可枚举。如果为true,则当用户执行for(obj中的var-prop){}(或类似操作)时,该属性将被迭代
从ecmascript5对象和属性中提取,正如您所读到的,有问题的变量的configurable
属性会影响变量是否可以删除。
"var a"意味着不能从当前块之外的任何地方访问它,因此删除它WOULDmeanUNDECLARE(与未定义的不同),从而允许在同一块中再次写入"var a"(错误)。
允许使用(MDN):
delete object.property
delete object['property']
delete object[index]
delete property
这就像GOTO和非结构化编程,在那里你可能需要手动清理资源,它有点像C中的~Destructor(尽管不一样)。您可以删除对象,如~a();但不能像"int i"那样"UNDECLARE"是一个变量。
- 全局变量和全局对象的属性之间有什么区别吗
- delete关键字在全局变量上的不同行为
- 在javascript函数中设置全局变量
- 如何将getJson的响应保存在全局变量中
- 从Javascript方法返回全局变量
- AngularJS中的封装窗口全局变量
- javascript隐式全局变量
- 如何从onclick函数设置全局变量并将其传递给另一个JS文件
- 如何使全局变量仅特定于该文件
- 在page.open()-PhantomJS中无法访问全局变量
- 使用全局变量来存储数字(JavaScript)
- 如何将变量声明为全局变量
- 在节点中创建文件全局变量
- 在Javascript中使用全局变量作为缓存是很好的
- 创建要在其他函数中使用的全局变量
- 为了避免创建全局变量,可以将所有变量分配给一个对象吗
- 创建不带 var 关键字的全局变量时出现意外行为
- Javascript Shadowing - 如果您尝试使用 VAR 关键字更改不存在的全局变量,则会产生效果
- 在javascript中,预定义的全局变量和关键字有什么区别?
- 在JavaScript中定义全局变量时省略var关键字