js写码良好习惯

【JS方面】javascript

  1. 大多数语言缩进标准都默认遵照4空格,可是对于js来讲,函数嵌套较多,因此为了阅读的方便,缩进可采用2空格。java

  2. 变量不要批量定义或赋值。如:json

    var a,b,c = 10;    //不建议闭包

  3. 变量、函数名采用小驼峰命名,对象/类采用大驼峰命名。如:函数

    var youName = “hehe”;this

    var myFunction = function(){return "hehe";};spa

    function myFunction() {return "hehe";}.net

    function MyFunction(){this.name = "hehe";}prototype

  4. 建议普通地方的引号用单引号,由于json和XML等都规定用双引号,这样就能够无需转义。对象

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

  6. 对象的属性千万不要做为原型定义,由于假如属性是一个对象的话,不一样实例中的属性会指向同一个地址(那个对象定义时成员属性所对应的地址),而且用原型定义的成员属性是多个实例共享的(有点相似于static)。而成员函数避免定义在构造函数内,不然会有运行时的闭包开销。如:

    function MyTest(name){    //这是正确的例子

        this.name = name;

        this.id = 1;

    }

    MyTest.prototype.getName() = function(){return this.name;};

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

  8. 函数内的局部变量在函数开始时就声明好,省得忘记或者形成其余错误解析。如:

    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了。

  9. 对象内的私有属性命名已下划线开头(业内广泛认可的写法)。可是,这样仍是不能避免对象的使用者非要修改这些属性。。。。。。有两种解决方案:一是使用闭包,二是使用类的封装。如:

    //使用闭包的方式

    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)

  10. 慎用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,因此二次绑定会失败。

相关文章
相关标签/搜索