4

我试图理解为什么 Javascript 程序员看不到使用类似枚举的对象来表示常量值而不是在整个代码中重复字符串的价值?例如:

foo.addEventListener("someEvent", function(event) { .... });

对比

foo.addEventListener(events.someEvent, function(event) { .... });

对我来说,第二个似乎更好,因为当你传入无效值时,像JSLintevents这样的工具将更有可能解决问题(如果它可以看到 的声明)。

我听到的支持字符串的论点基本上是“这就是 javascript 程序员这样做的方式”,这让我很恼火,因为它似乎与我曾经工作过的几乎所有其他语言的最佳实践背道而驰在。

所以请帮助我理解:这是我试图将我的 C 习惯强加给 JS 开发人员的一个案例——我需要学习改变我的方式吗?

4

4 回答 4

3

我个人不知道,但我认为问题在于许多 JS 编码人员没有意识到您可以(ab)使用关联数组来提供类似枚举的效果。

var events = {
    someEvent : "someEvent",
    someOtherEvent : "someOtherEvent"
}

foo(events.someEvent);

这样做绝对是一个好习惯,并且避免了很多编码问题。

于 2012-08-31T09:32:15.750 回答
1

在 JavaScript 中,属性查找可能很昂贵(范围遍历加上长原型链)。

而且我还没有看到一个静态分析器(包括 JSLint)实际上提取了一个对象的内容。

我个人喜欢你的方法,但它需要权衡取舍。

于 2012-08-31T09:32:48.613 回答
1

我不确定是谁告诉你的,但我个人上了一门专注于 Web 开发的课程,他们确实建议你将变量作为常量放在全局范围内,而不是一遍又一遍地不断输入字符串。它减少了麻烦,更有条理,在某些情况下甚至可以帮助实现可扩展性。

但是,我会说,总的来说,如果可以的话,最好避免使用全局变量(这在您可能知道的所有编码语言中都可以看到)。理想情况下,如果您不需要使其全球化并保持本地化,那么您应该这样做。如果您发现自己传递一个变量或一遍又一遍地使用一个不会改变的常量,那么是的,最好将它放在一个变量中。

底线:你不需要改变你的方式。实际上,我敢打赌,很多 JS 开发人员没有这些良好实践的原因是因为 javascript 的灵活性。我敢肯定,如果很多 JS 开发人员将 Java 或 C 作为他们的第一语言学习,他们也会有这些好习惯。

于 2012-08-31T09:49:14.607 回答
0

因为您必须events在 global/clusure 范围内添加变量。

但在 javascript 中,您应该始终将变量保留在本地范围内,因为这样会快得多。

于 2012-08-31T09:33:36.977 回答