我可以在JavaScript中删除全局变量

时间:2018-08-27 10:55:21

标签: javascript node.js

我想删除所有以“ Nwxp ”开头的全局变量。

因此,我遍历了所有全局变量。

检查开头是否与我的字符串相等,然后删除它们。

但是,delete关键字不会删除我的变量。我究竟做错了什么?

这是我的代码:

var strNwxp    = "Nwxp";

for (var variable in global){
    var toCheck = variable.substring(0, 4);
    if (strNwxp === toCheck) {
        delete variable;
    }
}

2 个答案:

答案 0 :(得分:1)

作为Yeldar Kurmangaliyev points out,您正在删除错误的内容。但是,即使删除正确的内容,也无法删除用var创建的全局变量。在这种情况下,delete会产生false(如果变量是以可以删除的方式创建的,例如true,则global.foo = 42)。因此,如果以这种方式创建的全局对象将无法正常工作。

另外,请注意,并非所有全局变量都不再是全局对象的属性,而不是从ES2015开始。具体来说,全局范围内的letconstclass创建的不是全局对象属性的全局变量。 (但是,如果您使用的是Node.js,则可能不在全局范围内使用它们。)

要确保您可以删除全局变量,请不要使用var,而要对global上的属性进行赋值:

global.Nwxplaskdflk = 42;

该全局变量可以删除。


一些注意事项:

  1. 我假设global是对代码中全局对象的引用。例如,您正在使用Node.js或类似的环境来创建它,或者您自己的代码中有var global = this;在全局范围内。

  2. 通常,如果可以避免创建全局变量,请避免创建全局变量。 :-)而是在其他对象上使用属性。 (如果由于某种原因引用该对象的变量必须是全局变量,那么它却是全局变量,但全局命名空间非常拥挤,最好避免添加到该变量中。)

答案 1 :(得分:0)

您的代码正在尝试删除名为variable的属性。
相反,据我了解,您实际上是想从global中删除一个属性,该属性的名称以字符串形式存储在variable中。

您需要致电delete global[variable]来完成此操作:

var strNwxp = "Nwxp";

for (var variable in global)
{
    var toCheck = variable.substring(0, 4);
    if (strNwxp === toCheck) {
        delete global[variable];
    }
}

假定Nwxp*属性直接分配给global而不是var
Another answer描述得更好。

在浏览器环境中,具有global的演示片段已更改为window

window.NwxpHello = "World!";    
window.NwxpKey = "value";
window.NotNwxpKey = "another value";
    
var strNwxp = "Nwxp";

for (var variable in window)
{
    var toCheck = variable.substring(0, 4);
    if (strNwxp === toCheck) {
        delete window[variable];
    }
}

console.log(window.NwxpHello); // undefined, starts with "Nwxp" - was removed
console.log(window.NwxpKey); // undefined, starts with "Nwxp" - was removed
console.log(window.NotNwxpKey); // another value

相关问题