将变量名作为字符串循环,并销毁它们
Looping through variable names as strings, and destroying them
我有一个变量列表(我们称它们为 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());
会将 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();
}
}
我有一个变量列表(我们称它们为 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());
会将 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();
}
}