JavaScript中全局变量的命名和格式化标准是什么?
例如:
var global_var // ?
var _global_var // ?
var GLOBAL_VAR // ?
var _GLOBAL_VAR // ?
...
注意:我不是在谈论常量,只是简单地说具有全局范围的变量。
没有这样的标准。最常见的做法是对所有变量和属性名称使用较低的驼峰情况(例如var fooBarBaz;
),而不考虑范围,但这绝不是普遍的。唯一的例外是大写要用作构造函数的函数的名称:
function SomeClass() {}
var someClassObj = new SomeClass();
我还看到了用于变量的块大写和下划线,作者认为常量,或者所有全局变量:
var EARTH_RADIUS = 6378100;
另一个相当常见的约定(虽然不是我自己使用的)是为作者希望被下划线认为是私有的对象的属性加上前缀:
this._leaveThisAlone = "Magical property";
Douglas Crockford几年前发表了his own take on JavaScript code standards,涵盖了大部分内容,但一如既往这只是一个人的意见,所以需要一点点盐。
如果你需要使用全局变量,重新考虑设计的必要评论,等等......
我见过的全局变量通常以g
或gbl
为前缀。有时用下划线修改:_g
,_gbl
。 IIRC,当“全球”局限于某个范围而非“真正”全球化时,使用了下划线。
如果你打算以一切不能使用变量的方式使用全局变量,我会使用下划线。在javascript(IIRC)中,使用下划线作为前缀的约定意味着该变量是“私有的”或不应该在外部使用。如果你是,或者以一种每个人都应该能够访问和修改的方式声明它,那么我只使用前缀而不是下划线。
人们告诉你不使用全局变量的一个重要原因是避免干扰其他脚本和/或库。
我在需要使用全局变量时开始使用的约定是添加我的姓氏 - 这样我知道我不会干扰任何库或外部脚本的全局变量。 (虽然我有一个相当独特的姓氏 - 如果你是史密斯,这可能不起作用)。
所以我的全局变量将命名为:
var foo_lastnameGlobal;
var bar_lastnameGlobal;
我应该指出(如果不清楚)这只是一个个人惯例,而不是一个普通或广泛使用的惯例。它还有助于我记住当我使用它们时我的全局变量。我想对公共代码或专业团队工作环境来说可能不是那么好。
我认为做这样的事情有两种意图。
做这种事情的第一个原因是能够在给定时间发现绑定到全局对象(通常是窗口或全局)的全局状态变量。问题在于,无论你有多严谨,只有两种实用的方法可以解决这个问题。首先是创建一个全局变量来按名称跟踪全局变量,并提交在添加/删除全局变量时始终更改它,第二个是保留全局初始状态的副本并确定添加,删除了哪些属性,或从一开始就改变了。
做这样的事情的第二个原因是在代码中强调它有意与全球状态交互。在这种情况下,通过添加注释或显式指定全局对象而不是隐式地执行此操作,没有标准的好处。
如果您决定更改表示文件或项目之间的常量的方式,则在代码中使用不一致的表示法会受到很多惩罚。有很多符号可供选择,并且所有符号都会以某种方式失败,无论是通过混淆变量名称还是自然的字母顺序,或者添加额外的引用开销。
就个人而言,如果有疑问,我喜欢坚持使用Linux Kernel coding style,我发现它足以解决许多问题。
C是斯巴达语言,您的命名也应如此。与Modula-2和Pascal程序员不同,C程序员不使用像ThisVariableIsATemporaryCounter这样可爱的名字。一个C程序员会调用那个变量tmp,这个变量更容易编写,而且难以理解。
但是,虽然混合大小写的名称不受欢迎,但全局变量的描述性名称是必须的。召唤全球职能foo是一种射击进攻。
GLOBAL变量(仅在您确实需要它们时使用)需要具有描述性名称,全局函数也是如此。如果你有一个计算活动用户数的函数,你应该调用count_active_users()或类似函数,你不应该把它称为cntusr()。
将函数类型编码到名称中(所谓的匈牙利表示法)是脑损坏的 - 编译器无论如何都知道类型并且可以检查它们,它只会使程序员感到困惑。难怪MicroSoft制作有缺陷的程序。
LOCAL变量名称应该简短,并且要点。如果你有一些随机整数循环计数器,它应该被称为i。如果没有机会被误解,那么调用它loop_counter是非生产性的。类似地,tmp可以是用于保存临时值的任何类型的变量。
如果你害怕混淆你的本地变量名,你还有另一个问题,就是所谓的功能 - 生长 - 激素 - 失衡综合症。见第6章(功能)。
如果您希望employeeID成为全局变量,那么正确的方法是声明为window.employeeID = 5;然后在稍后访问的所有位置使用window.employeeID。