1

在最近关于堆栈溢出的问题(使用 for 循环压缩代码)中,我了解到您可以通过 window 对象循环访问变量名。

读完这篇文章后,我想知道这是否被认为是坏习惯,以及这是否会以某些方式影响性能。

我猜这确实会降低 Javascript 的性能,因为您创建的变量比使用数组时要多得多。但是,如果您通过变量的直接名称“变量”与“窗口[变量]”访问变量,这是否也会产生一定的影响?这是检索价值的不同方法吗?还是这两种可能性在做同样的事情?


编辑: 正如@Tomalak 所说,询问性能问题可能没用,因为我没有遇到过这些问题。

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

4

3 回答 3

1

windowobject 已经充满了变数,尽管互联网上有大量的智能手机试图决定普遍最好的编码风格,但这仍然主要取决于个人喜好。一个人必须做他必须做的事。简而言之,@Tomalak 用他的评论把它钉住了——没有必要过度设计它。简单通常是最好的方法。

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

于 2013-10-30T14:18:48.550 回答
1

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

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

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

tl;dr:不要这样做,因为它会对性能产生负面影响(尽管可以忽略不计),并且在多个层​​面上都是不好的做法。唯一“可以”的情况是当您按名称调用函数时——但也要小心,因为这样做几乎等同于 using eval,这当然是邪恶的。

于 2013-10-30T14:21:40.277 回答
0

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

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

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

于 2013-10-30T14:21:40.120 回答