//Option A.) set to null
some_var = null;
//Option B.) set to undefined
some_var = undefined;
//Option C.) remove/delete the variable reference
delete obj.some_var
//if your variable was defined as a global, you'll need to
//qualify the reference with 'window'
delete window.some_var;
bah = {}, foo = {}; bah.ref = foo;
delete bah.ref;
alert( [bah.ref, foo ] )
// ,[object Object] (it deleted the property but not the reference to the other object)
如果你用var声明了一个变量,你不能删除它:
(function() {
var x = 5;
alert(delete x)
// false
})();
(function() {
var foo = 123;
delete foo; // wont do anything, foo is still 123
var bar = { foo: 123 };
delete bar.foo; // foo is gone
}());
但是由于全局变量实际上是窗口对象的成员,所以它是可行的。
当涉及到原型链时,使用删除会变得更加复杂,因为它只从目标对象中删除属性,而不是从原型中删除。例如,
function Foo() {}
Foo.prototype = { bar: 123 };
var foo = new Foo();
// foo.bar is 123
foo.bar = 456;
// foo.bar is now 456
delete foo.bar;
// foo.bar is 123 again.
在这种情况下,引用g_a被创建在ECMAScript规范中称为"< em > VariableEnvironment < / em >"这可能是在函数中使用var的情况下的函数执行上下文(尽管当你考虑let时可能会变得有点复杂),或者在"global"代码中,VariableEnvironment附加到全局对象(通常是window)。
当试图在不使用var关键字的情况下为一个名称赋值时,JavaScript会尝试在ECMAScript规范中称为“& < em > LexicalEnvironment < / em >"”的地方找到命名的引用,主要的区别是LexicalEnvironment是嵌套的——即LexicalEnvironment有一个父对象(ECMAScript规范中称为“外部环境引用")当JavaScript无法在LexicalEnvironment中找到引用时,它会在父对象LexicalEnvironment中查找(详见10.3.1和10.2.2.1)。顶层的LexicalEnvironment是"var1",它被绑定到全局对象,因为它的引用是全局对象的属性。因此,如果您试图在当前作用域或任何外部作用域中访问未使用var关键字声明的名称,JavaScript最终将获取window对象的属性作为该引用。正如我们之前所了解的,对象上的属性可以被删除。