Javascript Best Practices
[1] http://www.thinkful.com/learn/javascript-best-practices-1/
[2] http://www.zhangxinxu.com/wordpress/?p=1173
新名词:JSLint
记录自己平时不太清楚的部分,包括知道问题不知道解决方案,以及不知道问题的部分。
1. 全局变量
问题:
* 命名冲突导致变量被覆盖
解决:
* 使用闭包和模块模式(module pattern)[1]
* 命名空间模式[2] 或
+ 隐式全局变量
- 记得始终使用var来声明变量;使用链分配而不是任务链声明变量, 不要使用var a=b=0; 可以使用var a, b;
- 通过var创建的全局变量(任何函数之外的程序中创建)是不能被删除的;无var创建的隐式全局变量(无视是否在函数中创建)是能被删除的
2. 单var形式
问题:
* 程序内部存在不同程度的声明,可读性不强,不易于维护
解决:
* "使用一个var语句声明多个变量,并以逗号分隔。像这种初始化变量同时初始化值的做法是很好的。这样子可以防止逻辑错误(所有未初始化但声明的变量的初始值是undefined
)和增加代码的可读性。" [2]
3. var散布的问题hoisting: a problem with scattered vars
问题:
* JavaScript中,你可以在函数的任何位置声明多个var语句,并且它们就好像是在函数顶部声明一样发挥作用,这种行为称为 hoisting(悬置/置顶解析/预解析)。对于JavaScript,只 要你的变量是在同一个作用域中(同一函数),它都被当做是声明的,即使是它在var声明前使用的时候。)[2]
解决:
* 预先声明你想使用的全部变量
4. for循环
问题: 每次循环时数组的长度都要重新获取,降低性能
解决:
* 循环数组或对象的值时,缓存数组或集合的长度。[2]
for (var i = 0, max = myarray.length; i < max; i++) {
//code
}
/第一种变化的形式:* 使用i=i+1 或 i+=1来替换i++[2]
var i, myarray = [];
for (i = myarray.length; i–-;) {
// 使用myarray[i]做点什么
}
//第二种使用while循环:
var myarray = [],
i = myarray.length;
while (i–-) {
// 使用myarray[i]做点什么
}
5. for-in循环(也被称为“枚举”)[2]
问题: 循环对象或内容不确定,导致循环内容错误
解决: 采用hasOwnProperty()
6. 不要扩展内置原型 Augmenting built-in prototypes [2]
问题: 维护性差, 属性添加到原型中,如果不使用hasOwnProperty() 会导致循环混乱
解决: 不增加内置原型
(没懂)
7. switch模式,代码风格
8. 避免隐式类型转换 avoiding implied typecasting
问题: 变量比较时隐式类型转换会导致结果出错
解决: 比较值和表达式类型的时候始终使用===和!==操作符
9. 避免eval()[2]
问题: eval()方法接受任意的字符串,并当做javascript代码来处理。 "evals()是魔鬼"; 安全隐患;
解决: 用方括号表示法来访问动态属性会更好更简单; 使用new Function()代替; 封装eval()调用到一个即时函数中。
10. parseInt()下的数值转换
问题: 基数参数省略,导致意外结果
解决: 将字符串转换成数字
11. 分割单词
构造函数:upper camel case
其余函数: lower camel case
变量: lower camel case or underline