为什么不能删除全局变量?

时间:2014-02-23 07:22:50

标签: javascript

为什么无法删除正确声明的全局变量?

我不知道这是否适用于所有程序语言,但我知道在JavaScript中它无法删除。

来源:Javascript权威指南O'Reilly。

4 个答案:

答案 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创建的变量   以下条件:

     
      
  1. 您正在使用javascript解释器或命令行。

  2.   
  3. 您正在使用eval,并在那里创建和删除var。

  4.   

或者您可以将null设置为一个行为类似于已删除对象的变量

答案 2 :(得分:0)

在全局范围内创建变量时,会自动将 DontDelete 属性添加到变量并设置为true。这也是无法删除全局变量(或函数)的原因。

对于属性为false的其他变量,可以删除这些变量。

为了更加清晰,您可以参考文章:understanding delete

答案 3 :(得分:0)

使用ECMAscript 5,添加到对象的属性现在具有允许您更好地控制对象的属性。这些属性是:

  1. value - 属性的实际值
  2. writable - 如果属性可以/不能更改。
  3. configurable - 如果设置为false,任何更改其属性的尝试都将在严格模式下失败(并且在非严格模式下将返回false)
  4. enumerable - 如果在用户执行for (var prop in obj) {}
  5. 时可以迭代该属性

    可以使用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