Javascript 使用var和非var变量删除运算符
我尝试使用delete操作符删除javascript中的一个变量,但发现了一些问题。 你们能解释一下下面的代码,以及为什么会发生这种情况吗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,则使用=操作符赋值总是赋值属
>> 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';