【JS方面】javascript
大多数语言缩进标准都默认遵照4空格,可是对于js来讲,函数嵌套较多,因此为了阅读的方便,缩进可采用2空格。java
变量不要批量定义或赋值。如:json
var a,b,c = 10; //不建议闭包
变量、函数名采用小驼峰命名,对象/类采用大驼峰命名。如:函数
var youName = “hehe”;this
var myFunction = function(){return "hehe";};spa
function myFunction() {return "hehe";}.net
function MyFunction(){this.name = "hehe";}prototype
建议普通地方的引号用单引号,由于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,因此二次绑定会失败。