• 编写高质量代码【笔记】


    书写可维护的代码(Writing Maintainable Code )

    可维护的代码意味着:

    • 可读的
    • 一致的
    • 可预测的
    • 看上去就像是同一个人写的
    • 已记录

    最小全局变量(Minimizing Globals)

    每个JavaScript环境有一个全局对象,当你在任意的函数外面使用this的时候可以访问到。你创建的每一个全部变量都成了这个全局对象的属 性。在浏览器中,方便起见,该全局对象有个附加属性叫做window,此window(通常)指向该全局对象本身。

    myglobal = "hello"; // 不推荐写法
    console.log(myglobal); // "hello"
    console.log(window.myglobal); // "hello"
    console.log(window["myglobal"]); // "hello"
    console.log(this.myglobal); // "hello"

    全局变量的问题

    经验法则是始终使用var声明变量;

    忘记var的副作用(Side Effects When Forgetting var)

    隐式全局变量和明确定义的全局变量间有些小的差异,就是通过delete操作符让变量未定义的能力。

    • 通过var创建的全局变量(任何函数之外的程序中创建)是不能被删除的。
    • 无var创建的隐式全局变量(无视是否在函数中创建)是能被删除的。

    这表明,在技术上,隐式全局变量并不是真正的全局变量,但它们是全局对象的属性。属性是可以通过delete操作符删除的,而变量是不能的。

    在ES5严格模式下,未声明的变量(如在前面的代码片段中的两个反面教材)工作时会抛出一个错误。

    访问全局对象(Access to the Global Object)【。。。】

    在严格模式下时,你必须采取不同的形式。例如,你正在开发一个JavaScript库,你可以将你的代码包裹在一个即时函数中,然后从 全局作用域中,传递一个引用指向this作为你即时函数的参数。

    单var形式(Single var Pattern)

    在函数顶部使用单var语句是比较有用的一种形式;

    预解析:var散布的问题(Hoisting: A Problem with Scattered vars)

    JavaScript中,你可以在函数的任何位置声明多个var语句,并且它们就好像是在函数顶部声明一样发挥作用,这种行为称为 hoisting(悬置/置顶解析/预解析);因此,为了避免混 乱,最好是预先声明你想使用的全部变量。

    为了完整,我们再提一提执行层面的稍微复杂点的东西。代码处理分两个阶段,第一阶段是变量,函数声明,以及正常格式的参数创建,这是一个解析和进入上下文 的阶段。第二个阶段是代码执行,函数表达式和不合格的标识符(为声明的变量)被创建。但是,出于实用的目的,我们就采用了”hoisting”这个概念, 这种ECMAScript标准中并未定义,通常用来描述行为。

    for循环(for Loops)

    当你循环获取值时,缓存数组(或集合)的长度是比较好的形式,

    for (var i = 0, max = myarray.length; i < max; i++) {
    // 使用myarray[i]做点什么
    }

    注意到,当你明确想要修改循环中的集合的时候(例如,添加更多的DOM元素),你可能更喜欢长度更新而不是常量。

    伴随着单var形式,你可以把变量从循环中提出来,就像下面这样:

    function looper() {
    var i = 0,
    max,
    myarray = [];
    // ...
    for (i = 0, max = myarray.length; i < max; i++) {
    // 使用myarray[i]做点什么
    }
    }
    这种形式具有一致性的好处,因为你坚持了单一var形式。不足在于当重构代码的时候,复制和粘贴整个循环有点困难。例如,你从一个函数复制了一个循环到另一个函数,你不得不去确定你能够把imax引入新的函数(如果在这里没有用的话,很有可能你要从原函数中把它们删掉)。

    最后一个需要对循环进行调整的是使用下面表达式之一来替换i++;

    i = i + 1
    i += 1

    还有两种变化的形式,其又有了些微改进,因为:【。。。】

    • 少了一个变量(无max)
    • 向下数到0,通常更快,因为和0做比较要比和数组长度或是其他不是0的东西作比较更有效率

    <script>
    //第一种变化的形式:

    var i, myarray = ['a',1,'b',2,'c',3];
    for(i=myarray.length;i-=1;){
    // 使用myarray[i]做点什么
    console.log(i);
    }

    //第二种使用while循环:

    var myarray = ['a',1,'b',2,'c',3],
    i = myarray.length;
    while(i-=1){
    // 使用myarray[i]做点什么
    console.log(i);
    }

    </script>

    --------------------------------------------------------------------2014年10月24日------------------------------------------------------------------------------------------------------------------------------------------------------

    http://www.cnblogs.com/TomXu/archive/2011/12/28/2286877.html

    for-in循环(for-in Loops)

    最好数组使用正常的for循环,对象使用for-in循环。

    有个很重要的hasOwnProperty()方法,当遍历对象属性的时候可以过滤掉从原型链上下来的属性。

  • 相关阅读:
    [转]Linq使用心得——SelectMany替代二重foreach循环
    设计模式—装饰者模式
    设计模式—桥接模式
    iOS_autoLayout_Masonry
    排序算法
    h.264硬件解码
    FFmpegh.264解码
    AAC编解码
    socket UDP简单通讯
    socket TCP简单通讯
  • 原文地址:https://www.cnblogs.com/dingyuanxin/p/4048865.html
Copyright © 2020-2023  润新知