1.缩进(Indentation)
采用四个空格代码Tab 进行缩进
使用缩进的地方:
函数体、循环(do,while,for,for-in)、if、switch,以及对象字面中的对象属性。示例:
1 function outer(a, b) { 2 var c = 1, 3 d = 2, 4 inner; 5 if (a > b) { 6 inner = function () { 7 return { 8 r: c - d 9 }; 10 }; 11 } else { 12 inner = function () { 13 return { 14 r: c + d 15 }; 16 }; 17 } 18 return inner; 19 }
PS:代码没有缩进基本上就不能读了。唯一糟糕的事情就是不一致的缩进,因为它看上去像是遵循了规范,但是可能一路上伴随着混乱和惊奇。重要的是规范地使用缩进。
2.花括号{}
花括号(亦称大括号,下同)应总被使用,即使在它们为可选的时候。技术上将,在in或是for中如果语句仅一条,花括号是不需要的,但是你还是应该总是使用它们,这会让代码更有持续性和易于更新。
3.
3.空格(White Space)
空格的使用同样有助于改善代码的可读性和一致性。在写英文句子的时候,在逗号和句号后面会使用间隔。在JavaScript中,你可以按照同样的逻辑在列表模样表达式(相当于逗号)和结束语句(相对于完成了“想法”)后面添加间隔。
适合使用空格的地方包括:
- for循环分号分开后的的部分:如for (var i = 0; i < 10; i += 1) {...}
- for循环中初始化的多变量(i和max):for (var i = 0, max = 10; i < max; i += 1) {...}
- 分隔数组项的逗号的后面:var a = [1, 2, 3];
- 对象属性逗号的后面以及分隔属性名和属性值的冒号的后面:var o = {a: 1, b: 2};
- 限定函数参数:myFunc(a, b, c)
- 函数声明的花括号的前面:function myFunc() {}
- 匿名函数表达式function的后面:var myFunc = function () {};
使用空格分开所有的操作符和操作对象是另一个不错的使用,这意味着在+, -, *, =, <, >, <=, >=, ===, !==, &&, ||, +=等前后都需要空格。
最后需要注意的一个空格——花括号间距。最好使用空格:
- 函数、if-else语句、循环、对象字面量的左花括号的前面({)
- else或while之间的右花括号(})
空格使用的一点不足就是增加了文件的大小,但是压缩无此问题。
有一个经常被忽略的代码可读性方面是垂直空格的使用。你可以使用空行来分隔代码单元,就像是文学作品中使用段落分隔一样。
4.命名规范
另一种方法让你的代码更具可预测性和可维护性是采用命名规范。这就意味着你需要用同一种形式给你的变量和函数命名。下面是建议的一些命名规范,你可以原样采用,也可以根据自己的喜好作调整。同样,遵循规范要比规范是什么更重要。
以大写字母写构造函数(Capitalizing Constructors)
JavaScript并没有类,但有new调用的构造函数:
1 |
var adam = new Person(); |
因为构造函数仍仅仅是函数,仅看函数名就可以帮助告诉你这应该是一个构造函数还是一个正常的函数。命名构造函数时首字母大写具有暗示作用,使用小写命名的函数和方法不应该使用new调用:
1 |
function MyConstructor() {...} |
2 |
function myFunction() {...} |
分隔单词(Separating Words)
当你的变量或是函数名有多个单词的时候,最好单词的分离遵循统一的规范,有一个常见的做法被称作“驼峰(Camel)命名法”,就是单词小写,每个单词的首字母大写。
对于构造函数,可以使用大驼峰式命名法(upper camel case),如MyConstructor()。对于函数和方法名称,你可以使用小驼峰式命名法(lower camel case),像是myFunction(), calculateArea()和getFirstName()。
要是变量不是函数呢?开发者通常使用小驼峰式命名法,但还有另外一种做法就是所有单词小写以下划线连接:例如,first_name, favorite_bands, 和 old_company_name,这种标记法帮你直观地区分函数和其他标识——原型和对象。
ECMAScript的属性和方法均使用Camel标记法,尽管多字的属性名称是罕见的(正则表达式对象的lastIndex和ignoreCase属性)。
其它命名形式(Other Naming Patterns)
有时,开发人员使用命名规范来弥补或替代语言特性。例如,JavaScript中没有定义常量的方法(尽管有些内置的像Number, MAX_VALUE),所以开发者都采用全部单词大写的规范来命名这个程序生命周期中都不会改变的变量,如:
1 |
// 珍贵常数,只可远观 |
2 |
var PI = 3.14, |
3 |
MAX_WIDTH = 800; |
还有另外一个完全大写的惯例:全局变量名字全部大写。全部大写命名全局变量可以加强减小全局变量数量的实践,同时让它们易于区分。
另外一种使用规范来模拟功能的是私有成员。虽然可以在JavaScript中实现真正的私有,但是开发者发现仅仅使用一个下划线前缀来表示一个私有属性或方法会更容易些。考虑下面的例子:
01 |
var person = { |
02 |
getName: function () { |
03 |
return this ._getFirst() + ‘ ‘ + this ._getLast(); |
04 |
}, |
05 |
06 |
_getFirst: function () { |
07 |
// ... |
08 |
}, |
09 |
_getLast: function () { |
10 |
// ... |
11 |
} |
12 |
}; |
在此例中,getName()就表示公共方法,部分稳定的API。而_getFirst()和_getLast()则表明了私有。它们仍然是正常的公共方法,但是使用下划线前缀来警告person对象的使用者这些方法在下一个版本中时不能保证工作的,是不能直接使用的。注意,JSLint有些不鸟下划线前缀,除非你设置了noman选项为:false。
下面是一些常见的_private规范:
- 使用尾下划线表示私有,如name_和getElements_()
- 使用一个下划线前缀表_protected(保护)属性,两个下划线前缀表示__private?(私有)属性
- Firefox中一些内置的变量属性不属于该语言的技术部分,使用两个前下划线和两个后下划线表示,如:__proto__和__parent__。
注释(Writing Comments)
你必须注释你的代码,即使不会有其他人向你一样接触它。通常,当你深入研究一个问题,你会很清楚的知道这个代码是干嘛用的,但是,当你一周之后再回来看的时候,想必也要耗掉不少脑细胞去搞明白到底怎么工作的。
很显然,注释不能走极端:每个单独变量或是单独一行。但是,你通常应该记录所有的函数,它们的参数和返回值,或是任何不寻常的技术和方法。要想到注 释可以给你代码未来的阅读者以诸多提示;阅读者需要的是(不要读太多的东西)仅注释和函数属性名来理解你的代码。例如,当你有五六行程序执行特定的任务, 如果你提供了一行代码目的以及为什么在这里的描述的话,阅读者就可以直接跳过这段细节。没有硬性规定注释代码比,代码的某些部分(如正则表达式)可能注释要比代码多。
最重要的习惯,然而也是最难遵守的,就是保持注释的及时更新,因为过时的注释比没有注释更加的误导人。
来源:http://www.nowamagic.net/librarys/veda/detail/1629