以字符串形式遍历变量名并销毁它们

时间:2018-07-30 22:56:32

标签: javascript variables casting eval

我有一个变量列表(我们叫它们obj1obj2等)。我想遍历所有这些,如果存在,则销毁它们。显然.destroy()是外部呼叫。

为什么这样做:

for (var i = 0; i < 10; i++) {
    var obj = "obj" + i.toString();
    if (window[obj]) {
        window[obj].destroy();
    }
}

但这不是:

var objs = [];
for (var i = 0; i < 10; i++) {
    objs.push("obj" + i.toString());
    if (objs[i]) {
        objs[i].destroy(); //throws a TypeError
    }
}

有没有更好的解决方案,更像第二种解决方案,并且不涉及通过window访问全局范围?请不要说eval()

3 个答案:

答案 0 :(得分:2)

objs.push("obj" + i.toString()); string 推送到objs数组。但是字符串没有.destroy属性。相比之下,window["obj" + i.toString()]尝试通过该名称引用窗口对象上的属性。 (该属性中的值或undefined将被推送到objs

最好重组脚本,这样,与其在window对象中搜索特定名称的变量,不如将所有相关变量放入 array 中。开始,这样您就可以遍历数组并直接destroy()进行遍历:

const objs = [
  <someObj1>,
  <someObj2>,
  ...
];
objs.forEach(obj => obj.destroy());

答案 1 :(得分:1)

在第一个示例中,您将字符串用作对象窗口的键,如下所示:

filter

然后在其上调用destroy。

第二个示例不起作用,因为要插入数组的是字符串,

window.obj1

由于您创建了字符串数组,因此您在字符串本身中调用destroy。这就是为什么出现TypeError的原因。

答案 2 :(得分:1)

如果您不愿意使用窗口对象,为什么不将其克隆到名为容器的新对象上呢?那可能对您有用。谢谢

const container=window;

for (var i = 0; i < 10; i++) {
    var obj = "obj" + i.toString();
    if (container[obj]) {
        container[obj].destroy();
    }
}