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

时间:2014-03-11 05:46:43

标签: 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不同?

4 个答案:

答案 0 :(得分:6)

不使用var,使用=运算符的赋值总是分配属性,在第二种情况下,对象隐式地是全局对象(浏览器中为window)。

delete运算符仅 用于删除对象的属性,而非正常变量。

答案 1 :(得分:6)

当使用变量声明创建变量(即使用 var )时,会创建变量,并将其deleteable标志设置为 false

如果通过赋值隐式创建变量而未声明,则其可删除标志设置为 true

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

var a;

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

a = 'foo';

a 创建为没有声明的全局变量,因此其可删除标志设置为 true

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

答案 2 :(得分:3)

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

delete objectName.property 
delete objectName[index] 

答案 3 :(得分:1)

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

旁注: -

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

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