Javascript 使用var和非var变量删除运算符

Javascript 使用var和非var变量删除运算符,javascript,Javascript,我尝试使用delete操作符删除javascript中的一个变量,但发现了一些问题。 你们能解释一下下面的代码,以及为什么会发生这种情况吗 >> var a = 5; >> delete a false >>a 5 >> b=5; >>delete b true >>b ReferenceError b is not defined 为什么var a=5和b=5不同?如果不使用var,则使用=操作符赋值总是赋值属

我尝试使用delete操作符删除javascript中的一个变量,但发现了一些问题。 你们能解释一下下面的代码,以及为什么会发生这种情况吗

>> var a = 5;

>> delete a
false

>>a
5

>> b=5;

>>delete b
true

>>b
ReferenceError b is not defined

为什么var a=5和b=5不同?

如果不使用
var
,则使用
=
操作符赋值总是赋值属性,在第二种情况下,对象隐式地是全局对象(浏览器中的
窗口

delete
操作符仅用于删除对象上的属性,而不是正常变量。

操作符从对象(而不是正常变量)中删除属性。在这种情况下,对象是隐式全局的

旁注:-

当您编写
var x=5
时,它在当前范围即执行上下文中声明变量x。若声明出现在函数中,则声明局部变量;若声明在全局范围内,则声明全局变量


然而,当你说
x=5
时,它仅仅是一个属性赋值。它首先尝试根据作用域链解析x。如果它在该范围链中的任何位置找到
x
,则执行赋值,否则它将在全局对象上创建
x
属性。

删除操作符从数组中删除对象、对象属性或元素。运算符还可以删除未使用var语句声明的变量

delete objectName.property 
delete objectName[index] 

当使用变量声明(即使用var)创建变量时,创建变量时其可删除标志设置为false


通过赋值隐式创建变量而不声明时,其deleteable标志设置为true

全局执行上下文的一个特点是,变量也是全局对象的属性(这在函数或求值代码中不会发生)。所以当你这样做的时候:

var a;
然后a是一个变量,也是全局(浏览器中的窗口)对象的属性,并且其可删除标志设置为false。但是:

将创建为不带声明的全局变量,因此其deleteable标志设置为true


结果是,您可以删除隐式创建的全局变量,但不能删除由声明(包括函数声明)创建的全局变量。

+1如果OP想知道在
b
的情况下如何分配属性,它会将其分配给
窗口
对象。对其调用
delete
后,属性将从
窗口
对象中消失。答案非常混乱。简单的答案是,使用var创建的全局变量的可删除标志设置为false,而不使用var创建的全局变量(即通过简单赋值)的可删除平面设置为true。@RobG我将进行编辑,以减少(希望)混淆。嗨,alex,当我定义var a=5时,我有疑问;我检查>>窗口。a 5那么a是窗口对象的属性,那么为什么要定义删除运算符,即它删除对象属性;不起作用。@jforjs几年前我对它的理解现在似乎更清楚了。签出(您可能也应该接受他的)。注意:您不应该使用
delete
删除数组成员。是的……但我只是想让其他人知道,我们可以使用delete删除数组成员……因为它将只删除成员,但不会更改长度
a = 'foo';