这对于编写需要迭代变量的函数非常有用,但我听说用户建议不要使用类似的方法。
以这种方式编写代码有什么问题吗?
使用示例:
假设我有三个数组,并希望为这三个数组添加一个值:
array1=[];
array2=[1,2];
array3=[4,4];
for (var i=1;i< 4; i++){
window['array'+i].push(1);
}
答案 0 :(得分:1)
如果你需要迭代一组变量,请提前计划并将它们放在一个对象中:
var myArrays = {
array1: [],
array2: [1, 2],
array3: [4, 4],
"any-name-you-want-works": []
};
访问它们仍然很简单:
myArrays.array1.push(1);
myArrays["any-name-you-want-works"].push(1);
将新数组添加到myArrays
:
myArrays.array4 = [3, 5];
迭代变得简单(这是the recommended way):
for (var arr in myArrays) {
if (object.hasOwnProperty(arr)) {
arr.push(1);
}
}
如果您不需要支持旧浏览器,也可以使用较新的功能(source):
Object.keys(myArrays).forEach(function(key, index) {
myArrays[key].push(1);
});
有关Object.keys()
的更多信息。
然后,如果你正在使用像underscore或lodash这样的热门搜索引擎,你可以轻松地在对象和数组上做很多事情:
_.chain(myArrays)
.each(function(arr) { arr.push(1) }) // adds one to each array
.first() // takes the first array
.map(function(val) { return val *2; }) // and multiply each value
.reverse() // then reverse those values
.value(); // and get the array
正如我在评论中提到的那样,你不应该污染全局窗口对象,并且还要遍历它以避免碰撞或意外行为。
将代码包装在IIFE(Immediatly-Invoked Function Expression)中总是一个好主意,而不是使用全局范围,原因有多种,但那个&#39; sa whole other discussion和我们一样没有它你可以实现你想要的(无论如何这个问题)。
答案 1 :(得分:0)
将所有变量都放在全局范围内并不是一种好习惯。在某些情况下,它是可以接受的,例如,如果您有一个希望随处可用的库,但通常最好避免使用窗口,特别是在您使用它的方式。好消息是,您根本不需要window
做您想做的事情。您可以将数组作为属性添加到对象上,并使用与窗口相同的方式引用它们(这只是一个全局范围的对象)。请注意使用var
在本地范围对象。
var arrays = {
array1: [],
array2: [1,2],
array3: [4,4]
};
for (var i=1;i< 4; i++){
arrays['array'+i].push(1);
}