使用window ['variableAsString']有什么问题吗?

时间:2016-10-02 23:59:21

标签: javascript

这对于编写需要迭代变量的函数非常有用,但我听说用户建议不要使用类似的方法。

以这种方式编写代码有什么问题吗?

使用示例:

假设我有三个数组,并希望为这三个数组添加一个值:

array1=[];
array2=[1,2];
array3=[4,4];

for (var i=1;i< 4; i++){
    window['array'+i].push(1);
}

2 个答案:

答案 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()的更多信息。

然后,如果你正在使用像underscorelodash这样的热门搜索引擎,你可以轻松地在对象和数组上做很多事情:

_.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);
}