我有一个变量列表(我们叫它们obj1
,obj2
等)。我想遍历所有这些,如果存在,则销毁它们。显然.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()
。
答案 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();
}
}