JavaScript 基本技巧
1.尽量少用全局变量
(1)全局变量的说明
- 变量的作用域是以函数进行管理,函数以外为全局作用域
- 浏览器中以windows作为全局对象本身
(2)隐式产生的全局变量
- 在函数中不声明,直接使用的变量,默认为全局变量
function func(x,y){
result = x + y; // result 为全局变量
}
- 在函数中,使用链式赋值
function func(){
var a = b = 0; // b为全局变量 a为局部变量
}
- 严格模式下,在函数中不声明变量直接用会报错
(3)全局变量的删除问题
- 在全局作用域下,通过var声明的变量,不能使用delete删除
- 在全局作用域下,不通过var声明,直接使用的变量,可以使用delete删除
- 在函数作用域下,不通过var声明,直接使用的变量,可以使用delete删除(严格模式下不允许使用)
(4)单一var模式
只使用一个var在函数顶部进行变量声明(最好能赋初值)
function func(){
var a = 1,
b = 2,
sum = a + b,
obj = {},
i,
j,
...
//函数体
}
- 说明:在函数中,默认会将所有变量的声明语句置顶,因此建议,声明变量的语句均放置到函数体顶部
2.for循环的说明
- 遍历数组的长度需要进行缓存,可以提高速度
- 变量逐步减至0,可以提高效率,使用如下:
for(i = length;i--){
//代码
}
3.for-in循环的说明
- for-in循环用于枚举对象的所有属性
- 为了只把自定义属性枚举,而不是把所有内置属性枚举出来,需要使用hasOwnProperty()方法进行筛选,如下:
for(prop in obj){
if(Object.prototype.hasOwnProperty.call(obj,prop)){
//代码
}
}
4.不要增加内置的原型
- 不要为内置对象增加构造函数(Object,Array,Function等)
- 如果需要为原型添加自定义方法,采用如下方式:
if(typeof Object.prototype.method !== "function"){
Object.prototype.method = function () {
//函数体
}
}
5.switch使用模式
- 每个case与switch纵向排列整齐
- 每个case语句使用代码缩进
- 每个case语句结尾要有一个明确的break语句
- 避免使用fall-throughs方式
- 用default作为switch语句的结束
6.避免使用隐式转换
- 使用 === ,不要使用 ==
7.避免使用eval()
- 如果必须使用eval()函数,可以考虑使用new Function() 来代替
8.parseInt()使用
- 使用时一定不要忽略进制参数
9.编码约定
(1)缩进
- 对大括号中的所有代码执行缩进
(2)大括号
- 在可选使用大括号的情形下,都使用大括号
- 为避免解释器的默认行末加分号的问题,将左大括号与前一个语句放在同一行:
if(true){
//TODO
}
function(){
//TODO
}
(3)空格
使用空格的情况列举如下:
- for循环各部分的分号后
- for循环初始化多个变量时,每个声明后
for (var i = 0, max = 10; i < max; i++)
- 限定数组,每个元素逗号后面
var array = [1, 2, 3];
- 对象属性逗号后,属性名称和属性值之间的冒号后
var obj = {prop1: value1, prop2: value2};
- 函数中各参数后
- 函数声明的大括号之前
function func(a, b, c) {
}
- 匿名函数表达式之后
var func = function () {
}
- 建议在操作符后 ( + - * = < > === !== += 等)
- 在大括号之前使用一个空格
- 在大括号之后,如有else if 或者 while 使用一个空格
命名约定
- 构造函数使用首字母大写的驼峰命名
function MyConstructor(){
...
}
- 普通方法和变量使用驼峰命名
function myFunction(){
...
}
- 精确常量使用全部大写(虽然可以更改其值,但从命名上用于告知)
var PI = 3.14,
MAX_VALUE = 100
- 私有方法使用下划线加驼峰命名(虽然可以访问,但从命名上告知不用调用)
var obj = {
_privateFunc: function () {...}
};
- 受保护属性使用一个下划线开头,私有属性使用两个下划线开头
var obj {
_protectProp: value_1,
__privateProp: value_2
};
网友评论