JavaScript命名约定


257

我知道关于哪种命名约定最适合JavaScript的争论很多(也许没有争议,但至少有争论)。

您如何命名变量,函数,对象等?

我将对此保留自己的想法,因为我已经很长时间(仅几年)都没有使用JS,并且我只是收到了一个创建带有命名约定的文档的请求,该文档将在我们的工作项目中使用。因此,我一直在寻找(google-ing),有很多不同的意见。

我在JS上阅读的书本身也使用了不同的命名约定,但是它们都在一个方面达成了共识:“找到适合您的内容,并坚持下去。” 但是,既然我已经阅读了很多东西,我发现我喜欢其他一些方法,这比我现在所习惯的要好一些。


JS中常识命名约定的最新指南:robinwieruch.de/javascript-naming-conventions
Robin Wieruch

Answers:


202

我遵循Douglas Crockford的 javascript 代码约定。我还使用他的JSLint工具来验证遵循这些约定。


30
对于许多开发人员来说,JSLint可能过于激进和过于严格,那么JSHint可能是更好的选择。
Pavel Hodek'1

7
Crockford并未对此进行详细介绍,但是碰巧以大写字母开头的变量又如何呢,因为它们引用了首字母缩写词-应该将首字母还是整个首字母缩写为小写?例如:ECBhandleecbHandle(它不是不管什么ECB方式)。
Dan Dascalescu 2013年

13
尽管这是一个很好的链接,但我不能相信“链接答案”有这么多票。您至少可以提取并格式化链接页面的相关部分。
Adrien Be

2
我认为他在链接方面做得很好。如果您如此担心,则应编辑该帖子。
nckbrz 2014年

4
我确实很欣赏Crockford,但是他的代码约定似乎已经过时了。我建议您在列表的后面查看@PavelHodek答案
PerHornshøj-Schierbeck'15

160

正如Geoff所说,Crockford所说的是好的。

我遵循的唯一例外(并且已经广泛使用)是使用$ varname指示jQuery(或任何库)对象。例如

var footer = document.getElementById('footer');

var $footer = $('#footer');


7
我也为此使用$。我经常看到人们使用$表示对象的缓存副本。我一直以为这是玩文字游戏。缓存>“现金”> $
肖恩·韦纳

1
如果您使用的是AngularJS,这可能不是最好的主意-核心服务以'$'
开头

2
我强烈建议不要在变量名称中使用特殊字符。许多框架尤其使用$。
nckbrz 2014年

1
@nixxbb如果您正确地定义变量的范围,那也很好-体面的框架也可以。
安德烈·菲格雷多

1
我看到克罗克福德的公会提到“不要使用_底线作为名称的第一个或最后一个字符。它有时旨在表示隐私”。我个人使用下划线表示私人成员。这是不好的做法吗?有其他选择吗?
伊恩·G

112

您可以按照此Google JavaScript样式指南进行操作

通常,使用functionNamesLikeThis,variableNamesLikeThis,ClassNamesLikeThis,EnumNamesLikeThis,methodNamesLikeThis和SYMBOLIC_CONSTANTS_LIKE_THIS。

编辑:查看JavaScript样式指南和美化工具的不错集合。


15
考虑到他们开发了Dart和GWT(Chrome扩展javascript api也非常类似于Java),因此我不确定是否完全同意。对于Google的某些团队来说,开发JavaScript的最好方法可能是用其他某种语言编写。
badunk 2012年

2
我总是发现谷歌的私人命名约定,而不是_fooBar他们做的fooBar_-微软这样做是正确:asp.net/ajaxlibrary/act_contribute_codingStandards.ashx
丹尼尔Sokolowski

3
@DanielSokolowski使用智能感知时如何?如果为大量变量加上下划线前缀,则这只是您每次访问这些变量时必须键入的另一个字符。最后,您的智商列表看起来更干净,而且找到所需内容的速度也更快。
FreeAsInBeer 2014年

@FreeAsInBeer关于额外字符是正确的,但我认为它的速度不快。_引用私有变量时键入将立即导致智能感知,从而限制结果;最后以为是个人喜好。
Daniel Sokolowski14年

1
感谢您链接到样式指南列表。我不知道一个人是否值得完全关注,或者不知道如何决定哪个人,或者我是否应该使用合并。但是,知道在哪里可以找到几个地方是一个真正的福音。
Roger_S 2014年

9

我想尝试的一种约定是使用“ the”前缀命名静态模块。看一下这个。当我使用别人的模块时,很难知道我应该如何使用它。例如:

define(['Lightbox'],function(Lightbox) {
  var myLightbox = new Lightbox() // not sure whether this is a constructor (non-static) or not
  myLightbox.show('hello')
})

我正在考虑尝试一个约定,其中静态模块使用“ the”表示它们的存在。有谁见过比这更好的方法?看起来像这样:

define(['theLightbox'],function(theLightbox) {
  theLightbox.show('hello') // since I recognize the 'the' convention, I know it's static
})

6

我认为除了语法上的一些限制之外,命名约定推理在很大程度上与语言无关。我的意思是,支持c_style_functions和JavaLikeCamelCase的参数也可以相反地很好地使用,只是语言用户倾向于跟随语言作者。

话虽如此,我认为大多数库都倾向于遵循Java的CamelCase的简化。我发现道格拉斯·克罗克福德的建议对我来说足够有品味。


2

这是一个单独的问题,可能取决于您的工作方式。有些人喜欢将变量类型放在变量的开头,例如“ str_message”。有些人喜欢在单词之间使用下划线(“ my_message”),而另一些人则喜欢使用大写字母将它们分开(“ myMessage”)。

我经常与其他人一起使用庞大的JavaScript库,因此函数和变量(函数内的私有变量除外)必须以服务的名称开头,以避免产生冲突,例如“ guestbook_message”。

简而言之:根据我的看法,英语,小写,井井有条的变量和函数名是更可取的。名称应描述其存在而不是简短。


2
“因此,函数和变量(函数内的私有变量除外)必须以服务的名称开头,以免发生冲突。”此语句不准确。您可以正确地使用不会通过多个JavaScript框架流血的“命名空间”函数和对象。MIX11 channel9.msdn.com/Events/MIX/MIX11/OPN08
Chris Marisic 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.