在javascript中使用window [“variable”+ i]

时间:2013-10-30 14:01:45

标签: javascript performance

在最近关于堆栈溢出的问题(Using a for loop to condense code)中,我了解到你可以通过window对象循环遍历变量名。

读完这篇文章后,我想知道这是否被认为是不好的习惯,如果这会影响到某些方面的表现。

我猜这会降低你Javascript的性能,因为你创建了比你使用数组时更多的变量。但如果你通过它的直接名称“变量”与“窗口[变量]”访问变量,这是否也有一定的影响?这是一种不同的方法来检索价值吗?或者这两种可能性是完全相同的吗?


修改 正如@Tomalak所说,要求性能问题可能毫无用处,因为我没有遇到它们。

由于在窗口对象中放置大量变量名称是一个不好的习惯,那么你将使用window [variable]而不是替代的用例是什么?这有用的用法吗?

3 个答案:

答案 0 :(得分:1)

window对象已经充满了变量,尽管互联网上大量的智能头试图决定普遍最佳的编码风格,但它仍然主要是个人偏好。人们必须做自己必须做的事情。简而言之,@ Tomalak用他的评论来确定它 - 没有必要过度设计它。简单性通常是最好的方式。

保持整洁的一种方法是将自己的对象声明为windowwindow.myGlobals并将所需的所有内容放入该对象中。

答案 1 :(得分:1)

使用全局变量通常是个坏主意。拥有动态变量名称也被认为是不好的做法,这就是使用这种技术时你会做的事情。要存储项目列表,请使用数组。这就是阵列的用途。

现在,至于计算时间......差异在于分数秒的分数范围。但是,使用window["variable" + i] is slower因为要查找适当的值,需要连接属性字符串。使用数组,您只需传入索引,不需要连接或转换为字符串,这就是对象查找所发生的情况。因此,避免window["variable" + i]实际上要快得多。

对于使用动态变量的情况实际上很有用 - 嗯,并不多。我能想到的window[variableName]唯一可能用途是variableName是指您需要调用的函数。这看起来像这样:window["someFunction"]();

tl; dr :不要这样做,因为它会对性能产生负面影响(虽然可以忽略不计)并且在几个级别上都是不好的做法。唯一一次它“好”就是当你通过名字调用一个函数时 - 但是也要小心,因为这样做几乎等同于使用eval,这当然是邪恶的。 / p>

答案 2 :(得分:0)

将变量放在全局范围内(在浏览器的情况下作为窗口对象的属性)称为命名空间污染,这是一种糟糕的形式,因为与分离良好的模块化代码相比,它使得理解代码变得更加困难。难以理解的代码会导致维护中的错误和困难。

有理由将某些变量放在全局空间中(因为多个脚本需要它们),但通常的做法是尽可能少地放置。例如,jQuery库将jQuery对象放在全局范围中。其他任何内容都是自包含的或作为该对象的属性公开。 jQuery插件使用该对象,并通过它提供接口。

在您的特定情况下,您从localStorage中提取了大量信息并将其放入编号变量中。带有窗口['id'+ i]的解决方案作为补丁提供,可以改变您的代码,但最好是将所有数据封装在一个数组中,您可以简单地将其作为数据[i]访问。请注意,此数组也在全局范围内,但它是全局范围内唯一的数组。