为什么无法删除正确声明的全局变量?
我不知道这是否适用于所有程序语言,但我知道在JavaScript中它无法删除。
来源:Javascript权威指南O'Reilly。
答案 0 :(得分:4)
当您使用全局变量并且希望能够删除它们时,您应该在全局对象中轻松定义它们,而不在语句中使用var
,例如:
假设您要在代码中定义全局变量,并且您需要能够随时删除它们,所以如果您这样做:
function myfunc(){
var name = "Robert";
console.log(delete name);
}
并在你的控制台中调用它,false
作为删除语句的结果,这意味着它没有被删除,但如果你这样做:
function myfunc(){
var obj = {};
obj.name = "Robert";
console.log(delete obj.name);
}
那么你的结果就是真的,这意味着它现在就被删除了。
现在为全局对象创建它:
window.myobj = {};
然后你可以删除它,它实际上被删除了:
delete window.myobj;
或
delete window["myobj"];
当你在窗口上下文中使用var
创建变量时,虽然它在窗口中的对象上,但它不会被删除,例如,如果你这样做:
var myobj = {};
在浏览器开发控制台中,它在窗口中定义,您可以像:
window.myobj
但您无法将其删除,因为您已在var
语句中对其进行了定义。
但是如果你真的希望它从内存中删除,请不要忘记将它设置为null
:
window["myobj"] = null;
delete window["myobj"];
答案 1 :(得分:0)
正如用户in this answer
所述Eric Leschinski在JavaScript中删除变量:
<强>要点:强>
您在JavaScript中删除变量时遇到问题的原因 是因为JavaScript不会让你。您无法删除任何已创建的内容 除非我们把一只兔子拉出我们的伎俩,否则用var命令。
delete命令仅适用于未包含的对象属性 用var。
创建JavaScript将允许您删除使用var创建的变量 以下条件:
您正在使用javascript解释器或命令行。
- 醇>
您正在使用eval,并在那里创建和删除var。
或者您可以将null设置为一个行为类似于已删除对象的变量
答案 2 :(得分:0)
在全局范围内创建变量时,会自动将 DontDelete 属性添加到变量并设置为true。这也是无法删除全局变量(或函数)的原因。
对于属性为false的其他变量,可以删除这些变量。
为了更加清晰,您可以参考文章:understanding delete
答案 3 :(得分:0)
使用ECMAscript 5,添加到对象的属性现在具有允许您更好地控制对象的属性。这些属性是:
for (var prop in obj) {}
可以使用Ecmascript 5公开的另一个API来检查这些属性:
Object.getOwnPropertyDescriptor(obj, prop)
现在,当你创建一个全局变量没有'var'关键字时,就像这样:
sum = function (a, b) { return a + b; }
然后在窗口对象上创建此属性“sum”,并将可配置属性设置为 true 。
console.log(Object.getOwnPropertyDescriptor(window, "sum"))
...因此,该属性可以从窗口对象中删除。
delete window.sum //returns true
但是当您使用var关键字创建属性时,可配置属性设置为 false ,如下所示:
var multiply = function (a, b) { return a * b; }
console.log(Object.getOwnPropertyDescriptor(window, "multiply"))
...现在,此属性无法删除。
delete window.multiply //returns false in non-strict mode
礼貌:John Resig