我有一个变量列表(我们称它们为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()
。 最佳答案
objs.push("obj" + i.toString());
将一个字符串推入objs
数组。但是字符串没有.destroy
属性。相比之下,window["obj" + i.toString()]
尝试通过该名称引用窗口对象上的属性。 (该属性中的值或undefined
将被推送到objs
)
最好重新构造脚本,以便与其在window
对象中搜索特定名称的变量,不如在开始时将所有相关变量放入数组中,以便随后遍历该数组并直接destroy()
它们:
const objs = [
<someObj1>,
<someObj2>,
...
];
objs.forEach(obj => obj.destroy());