【问题标题】:JavaScript naming conventions [closed]JavaScript 命名约定 [关闭]
【发布时间】:2025-12-28 18:35:12
【问题描述】:

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

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

我会留下我自己的想法,因为我已经很久没有做 JS(只有几年),我刚刚收到一个请求,要创建一个包含命名约定的文档,以用于我们的工作中的项目。所以我一直在寻找(google-ing),有很多不同的意见。

我读过的关于 JS 的书籍本身也使用不同的命名约定,但他们都同意一点:“找到适合你的,并坚持下去。”但是现在我已经阅读了很多,我发现我喜欢其他一些方法比我现在习惯的要好一些。

【问题讨论】:

标签: javascript naming-conventions


【解决方案1】:

我关注 Douglas Crockford's code conventions 的 JavaScript。我还使用他的JSLint 工具来验证是否遵循这些约定。

【讨论】:

  • JSLint 对于许多开发人员来说可能过于激进和限制,那么JSHint 可能是更好的选择。
  • Crockford 没有详细介绍这个级别,但是碰巧以大写字母开头的变量呢,因为它们指的是首字母缩写词 - 第一个字母或整个首字母缩写词应该小写?示例:ECBhandleecbHandle(它不管欧洲央行的意思是什么)。
  • 虽然这是一个很好的链接,但我无法相信“链接答案”有这么多票。您至少可以提取和格式化链接页面的相关部分。
  • 我认为他在链接方面做得很好。如果您如此担心,您应该编辑帖子。
  • 我真的很尊敬 Crockford,但他的代码约定似乎已经过时了。我建议在列表中进一步查看@PavelHodek 的答案
【解决方案2】:

正如 Geoff 所说,Crockford says 很好。

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

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

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

【讨论】:

  • 我也为此使用了 $。我经常看到人们使用 $ 来表示对象的缓存副本。我一直以为是文字游戏。缓存>“现金”> $
  • 如果您使用 AngularJS,这可能不是最好的主意 - 核心服务以 '$' 为前缀
  • 我强烈建议不要在变量名中使用特殊字符。很多框架都特别使用 $。
【解决方案3】:

你可以关注这个Google JavaScript Style Guide

一般情况下,使用 functionNamesLikeThis、variableNamesLikeThis、ClassNamesLikeThis、EnumNamesLikeThis、methodNamesLikeThis 和 SYMBOLIC_CONSTANTS_LIKE_THIS。

编辑:查看JavaScript Style Guides And Beautifiers 的精彩集合。

【讨论】:

  • 考虑到他们开发了 Dart 和 GWT(chrome 扩展 javascript api 也非常类似于 java),我不确定我是否完全同意这一点。对于 Google 的一些团队来说,开发 javascript 的最佳方式可能是用其他语言编写它。
  • 我总是发现 Google 的私有命名约定 odd,而不是 _fooBar 他们这样做 fooBar_ - Microsoft 是正确的:asp.net/ajaxlibrary/act_contribute_codingStandards.ashx
  • @DanielSokolowski 使用智能感知时会怎样?如果您在大量变量前加上下划线,那么这只是您每次访问这些变量时必须输入的另一个字符。最后使用它,您的智能感知列表看起来更清晰,并且可以更快地找到您需要的内容。
  • @FreeAsInBeer 关于额外字符是正确的,但我认为它不会更快。在引用私有变量时键入 _ 会立即导致智能感知限制结果;最后认为这是个人喜好。
  • 感谢您链接到样式指南列表。我不知道是否值得专门关注或如何决定哪一个或是否应该使用合并。但是知道在哪里可以找到几个在一个地方是一个真正的福音。
【解决方案4】:

我想尝试的一个约定是使用“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
})

【讨论】:

    【解决方案5】:

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

    话虽如此,我认为大多数库都倾向于大致遵循 Java 的 CamelCase 的简化。我觉得Douglas Crockford advices 对我来说足够有品位了。

    【讨论】:

      【解决方案6】:

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

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

      简而言之:在我看来,英文、小写、组织良好的变量和函数名称更可取。名称应该描述它们的存在而不是简短。

      【讨论】:

      • “所以函数和变量(函数内部的私有变量除外)必须以服务的名称开头以避免冲突,”这句话不准确。您可以正确地拥有不会通过多个 javascript 框架流血的“命名空间”函数和对象。 MIX11 channel9.msdn.com/Events/MIX/MIX11/OPN08 有一个很好的介绍如何实现这一点