您的位置:首页 > Web前端 > JavaScript

js写码良好习惯

2015-01-22 00:00 162 查看
摘要: 不是规范,但是很多都成了业内共同遵守的不成文规定吧~~~有助于优化性能、提高代码可读性。

【JS方面】

大多数语言缩进标准都默认遵守4空格,但是对于js来说,函数嵌套较多,所以为了阅读的方便,缩进可采用2空格。

变量不要批量定义或赋值。如:
var a,b,c = 10; //不建议

变量、函数名采用小驼峰命名,对象/类采用大驼峰命名。如:
var youName = “hehe”;
var myFunction = function(){return "hehe";};
function myFunction() {return "hehe";}
function MyFunction(){this.name = "hehe";}

建议普通地方的引号用单引号,因为json和XML等都规定用双引号,这样就可以无需转义。

较为严格的判断使用===而不是==。

对象的属性千万不要作为原型定义,因为假如属性是一个对象的话,不同实例中的属性会指向同一个地址(那个对象定义时成员属性所对应的地址),并且用原型定义的成员属性是多个实例共享的(有点类似于static)。而成员函数避免定义在构造函数内,否则会有运行时的闭包开销。如:
function MyTest(name){ //这是正确的例子
this.name = name;
this.id = 1;
}
MyTest.prototype.getName() = function(){return this.name;};

避免使用多重继承、继承树以及其他复杂的继承,因为js毕竟只是基于对象而非面向对象的语言,复杂的继承会让程序的逻辑变得复杂,代码可读性降低。

函数内的局部变量在函数开始时就声明好,免得忘记或者造成其他错误解析。如:
var a = "hehe";
function test(){
console.log(a);
var a = "xixi";
}
test(); //输出undefined
function f1(){console.log(a);}
f1(); //输出hehe
function f2(){
var a = "yy";
f1();
}
f2(); //输出hehe
要点一:之所以没有输出hehe或者xixi,是因为在需要访问变量a时,js会首先在函数作用于内搜索是否有变量a(假如没有,依次往上,直到全局),在函数作用域内找到了变量a,但是在执行到console.log(a);时,变量a还没有被声明,所以结果会是undefined。

要点二:为什么调用f2();也是输出hehe呢?这是因为,js的作用域是静态作用域,作用域的确定是在定义时决定而不是在运行时,所以在定义时,在f2()执行到f1()时,跳到f1(),而f1()里确定了打印的是hehe,再返回f2()时继续往下执行而不是去搜索变量a了。

对象内的私有属性命名已下划线开头(业内普遍承认的写法)。但是,这样还是不能避免对象的使用者非要修改这些属性。。。。。。有两种解决方案:一是使用闭包,二是使用类的封装。如:
//使用闭包的方式
var test =function(){
var count = 0;
var get = function(){
count++;
return count;
};
return get;
};
var testDom = test();
console.log(testDom()); //只能通过get访问count,而不能直接访问到count属性了
//使用类封装的方式,请参照另一篇博客:javascript模拟面向对象的类(http://my.oschina.net/u/1580821/blog/365342)

慎用this,因为this是指向的是运行时的上下文对象(和上面第8点有点相反)。如:
var test1 = {
name:"name1",
getName:function(){console.log(this.name);}
};
test1.getName(); //输出name1
var test2 = {
hehe:test1.getName,
name:"xixi"
};
test2.hehe(); //输出xixi this不属于某个函数,而是函数调用时所属的对象。
当然,也可以手动修改上下文范围。。。
var test3 = {name:"yy"};
test2.hehe.call(test3); //则输出yy,此时传入的test3改变this的上下文范围。。。
当然,也可以绑定永久的上下文范围,这样无论被谁调用,不用传上下文范围都固定是绑定那个了。
test2.hehe.bind(test3); //绑定的上下文范围是test3,以后调用就不用传test3了,并且无论在哪调用上下文范围都固定是test3。
警告:尽量避免二次bind绑定上下文范围或参数表,二次绑定上下文范围bind会失败,因为其实现原来是调用call来实现,然而在其中间实现的时候没有了this,所以二次绑定会失败。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: