JavaScript模式(第二章)

编写可维护的代码##

  • 易维护的代码有以下特性:

    • 阅读性好
    • 具有一致性
    • 预见性好
    • 看起来如同一个人编写
    • 有文档

尽量少用全局变量###

  • js使用函数管理作用域。变量在函数内部声明,只能在函数内部使用。全局变量相反,在函数外部声明,在函数内无需声明即可使用。
  • 全局变量的问题是他在整个js应用和web页面内共享。他们生存在同一个全局命名空间内,总有可能发生命名冲突。
  • 减少全局变量的方式:
    • 命名空间模式
    • 自执行立即生效函数
    • 使用var声明变量
  • js会出人意料的产生全局变量,其原因在于:
    • js可直接使用变量,甚至无需声明
    • 任何变量,未经声明,就会为全局所有

变量释放时的副作用

  • 使用var定义的全局变量不能删除。
  • 隐含(不使用var声明)全局变量可以被删除。(因为创建的不是真正的变量,而是全局对象的属性,属性可以被删除)

单一var模式

  • 只使用一个var在函数顶部进行变量声明是一种非常有用的模式。好处:
    • 提供一个单一的地址以查到函数声明的所有局部变量
    • 防止出现变量在定义前就被使用的逻辑错误
    • 帮助牢记要声明变量,以尽可能的少的使用全局变量
    • 更少的编码

提升:凌散变量问题

  • js允许在函数的任意地方声明多个变量,无论在哪里声明,效果都等同于在函数顶部声明。

for循环

  • HTML容器对象的麻烦在于他们在document(html页面)下是活动的查询。也就是说,每次访问任何容器的长度时,也就是在查询活动的DOM,而通常DOM操作是非常耗时的。因此在for循环是,将已经遍历过的数组(或容器)的长度缓存下来。
  • for循环中的两个变量引出了一些细微的操作,原因是:
    • 使用了最少的变量
    • 逐步减到0,因为同0比较比同数组的长度比较更有效率。
      var i,myarray = []; for(i=myarr.length;i--){ //处理myarray[i] }

for-in循环

  • for-in循环用来遍历非数组对象。使用for-in循环通常被称为枚举。
  • hasOwnProperty 用来判断该属性是否是自有的属性

不要增加内置的原型

  • 以下情况可以向内置对象的原型中添加属性:
    • 某个属性在将来的es标准中可能出现
    • 是某个浏览器的一部分,但自定义时检查未出现
    • 与团队交流过,并留下文档

switch

  • switch通常采用如下格式:
    • 使每个case和switch纵向排列整齐
    • 在每个case语句中使用代码缩进
    • 在每个case语句结尾有一个明确的break语句
    • 避免使用fall-throughs(有意不使用break语句,以使得程序会按顺序一直向下执行)
    • 用default语句来作为switch的结束

避免使用隐式类型转换

  • JavaScript在使用比较语句时会使用隐式类型转换。为了避免隐式类型转换导致的混淆不清,请在使用比较语句的时候使用=和!操作

避免使用eval()

  • 使用new Function()构造函数和eval()比较类似,因此该函数的使用也需要十分小心。
  • 如果要使用eval(),可以使用new Function()来替代。好处是在new Function()中的代码将在局部函数空间中运行。另一个避免自动成为全局变量的方法是将eval()调用封装到一个即时函数中。
  • 另一个new Function()和eval()的区别在于eval()会影响到作用域,而Function更多地类似于一个沙盒。Function只能看到全局作用域,对局部作用域影响较小。

使用parseInt()的数值约定

  • parseInt()尽量不要省略第二个参数,因为省略之后,会将0开头的数值转换为8进制数。

命名约定

  • 构造函数首字母大写
  • 驼峰命名
posted @ 2017-03-04 21:05  oN_Name  阅读(210)  评论(0)    收藏  举报