我尝试使用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不同?
答案 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
属性。