在最近关于堆栈溢出的问题(Using a for loop to condense code)中,我了解到你可以通过window对象循环遍历变量名。
读完这篇文章后,我想知道这是否被认为是不好的习惯,如果这会影响到某些方面的表现。
我猜这会降低你Javascript的性能,因为你创建了比你使用数组时更多的变量。但如果你通过它的直接名称“变量”与“窗口[变量]”访问变量,这是否也有一定的影响?这是一种不同的方法来检索价值吗?或者这两种可能性是完全相同的吗?
修改 正如@Tomalak所说,要求性能问题可能毫无用处,因为我没有遇到它们。
由于在窗口对象中放置大量变量名称是一个不好的习惯,那么你将使用window [variable]而不是替代的用例是什么?这有用的用法吗?
答案 0 :(得分:1)
window
对象已经充满了变量,尽管互联网上大量的智能头试图决定普遍最佳的编码风格,但它仍然主要是个人偏好。人们必须做自己必须做的事情。简而言之,@ Tomalak用他的评论来确定它 - 没有必要过度设计它。简单性通常是最好的方式。
保持整洁的一种方法是将自己的对象声明为window
(window.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]访问。请注意,此数组也在全局范围内,但它是全局范围内唯一的数组。