我有一个变量列表(我们称它们为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()

最佳答案

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

最好重新构造脚本,以便与其在window对象中搜索特定名称的变量,不如在开始时将所有相关变量放入数组中,以便随后遍历该数组并直接destroy()它们:

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

10-04 16:11