将变量名作为字符串循环,并销毁它们

Looping through variable names as strings, and destroying them

我有一个变量列表(我们称它们为 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()); 会将 string 推送到 objs 数组。但是字符串没有 .destroy 属性。相比之下,window["obj" + i.toString()] 尝试通过该名称在 window 对象上引用 属性。 (属性 或 undefined 中的值将被推送到 objs

最好重构您的脚本,而不是在 window 对象中搜索特定名称的变量,而是将所有相关变量放入 数组 一开始,这样你就可以遍历数组并直接 destroy() 它们:

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

在第一个示例中,您使用字符串作为对象 window 的键,如下所示:

window.obj1

然后对其调用销毁。

第二个例子不起作用,因为你推入数组的是一个字符串,

"obj" + i.toString()

自从您创建了一个字符串数组后,您就在字符串本身中调用了 destroy。这就是你得到 TypeError 的原因。

如果您懒得使用 window 对象,为什么不将其克隆到一个名为容器的新对象中呢?这可能对你有用。谢谢

const container=window;

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