编写可维护的JavaScript代码

  • 什么是可维护性?
  • JavaScript如何实现可维护性代码?

 一、什么是可维护性?

1.1什么是可维护性?

修改bug和新增迭代功能一个项目不可避免的基本操作需求,代码良好的阅读性、代码结构的一致性、预留未来迭代的空间、统一代码规范、充分必要的注释文档是可维护性的代码必须具备的特征。

为了保证实现的代码良好的可维护性,首先是规避语言本身容易引发bug的问题,保持良好的代码习惯,严格按照开发规范执行项目的开发。深入了解编程语言的语法、特性、底层实现逻辑,合理的使用语言的各种功能和API。

 二、JavaScript如何实现可维护性代码?

要想实现良好的可维护性JavaScript项目,首先就需要了解JavaScript中容易引发bug的问题,正确的理解JavaScript语法与API。然后基于熟练的语言应用能力,制定合理的开发规范实现项目的开发。接下来列举总结一些常见的JavaScript容易引发bug的语法等问题,并简单说明和提供解决方案,具体相关详细内容参考《JavaScript模式》。

2.1变量声明可能引发的Bug:

  • 尽量不使用全局变量,一是JS可以直接使用变量,甚至无需声明;二是JS有暗示全局变量的概念,即任何变量如果未经声明使用,就会默认作用成全局变量。
  • delete只能释放对象的属性,不能释放变量;有时候也能删除全局变量是因为该全局变量采用的反模式(即未使用var等声明符)声明的变量,本质上这类全局变量被视作全局对象window的属性,而非全局作用域上的变量。
  • 获取可靠的全局对象,可以通过非new执行函数内this获取,因为js中非new执行函数其this默认指向全局对象。当然可以使用ES5的严格模式,阻止window作为自定义变量。
var global = (function(){
    return this;
}());
  • 使用单一var模式:即再函数顶部使用一个var,通过逗号间隔的方式将所有该作用的变量统一声明;其一这有利于以后阅读代码,其二函数本省执行时首相会将所有变量进行提升,详细参考javasrcipt的作用域和闭包(二)续篇之:函数内部提升机制与Variable Object。ES6中新增了let,const新的变量声明符但这依然不影响这一原则,依然建议将所有变量声明写函数的顶部。
  • 避免使用eval(),其一eval()会将一段字符串作为JS代码编译执行,这存在巨大的安全隐患,特别是可能用于解析执行从网络上获取的JSON格式JS代码,非常容易被恶意代码入侵;其二eval()的执行会导致不可预测的暗示全局变量,由此引发意想不到的BUG。如果不可避免的需要使用eval,可以使用一个立即执行函数将其包括,可以规避其污染全局变量的可能。
var jsStr = "var n = 3; console.log(n);";
(function(){
    eval(jsStr);    //3
}());
console.log(typeof n);    //undefined

 2.2逻辑代码与循环结构如何写出高效的代码?

  • 单变量模式:循环中用于作用循环逻辑的参数提取出来使用一个变量提取出来,避免每一次判断都去列表中访问对应属性。在火狐3浏览器中使用单变量模式实现变量DOM列表可以提高3被速度,在IE7浏览器中可以提高170倍速度(这个测试数据是老版本浏览器)。这种模式除了运行速度的优化,还可以提高模板代码的复制,在同一中模式中的不同场景下,循环内部的操作不需要做任何修改,只需要将参数赋给对应的变量就可以实现设计模式的复用。
function fun(){
    var  i,  
          max,
          myArray = [];
          //...
    for(i = 0, max = myArray.length; i < max; i++){
        //...
    }
}
  • 使用for in和Object.prototype.hasOwnProperty规避对象中不允许枚举的属性被循环操作,提高对象遍历效率。
  • 使用switch替代多个if else结构,让代码具备更好的可读性和健壮性,尽量不要在switch中使用fall-throughs,也就是有意不适用break语句结束当前case,让程序按顺序一直往下执行。
  • 尽量使用绝对等于替代等于的逻辑判断,提高代码的可读性和健壮性。逻辑运算中的类型转换可以参考这篇博客:JS强制类型转换之:比较运算到底发生了什么?

2.3命名约定:

  • 构造函数首字母大写(大驼峰)
  • 分隔单词:小驼峰分隔法、下划线分隔法两种比较常见
  • 私有方法使用下划线开头,这一约定在ES6中可以使用ES6的私有方法语法实现

2.4其他实现可维护性JS代码的特性和编码约定

  • 尽量不增加內置对象的原型属性,随意增加原型属性会导致代码出现不可预测性的问题;但在某些情况下不得不在內置原型上添加属性,比如为了向前兼容、为了兼容部分浏览器或设备、为了统一团队的其他成员的代码。
if(typeof Object.prototype.myMethod !== "function"){
    Object.prototype.myMethod = function(){ 
        //... 
    }
}
  • 使用parseInt()提取字符串数值时注意开头的字符若为0时,ES5之前该方法将以8进制提取该数值,虽然在最新的浏览器中默认为10进制,但是建议在使用parseInt转换数值时在第二个参数上指定其转换的计算进制。
  • 保持良好的代码注释和统一的风格,如果使用API文档工具提取注释作为API文档使用,根据具体的工具实现。
  • 编码:统一代码缩进的空格数;
    • if和for内部只有一条语句时,建议不省略大括号;
    • 大括号与所属语句保持同一纵向位置对其。
    • 空格:for循环中各个部分分号之后建议使用空格分隔;
      • for循环中初始化多个变量逗号后建议使用空格分隔;
      • 数组元素逗号后建议使用空格分隔;
      • 同一行的对象属性建议逗号后使用空格分隔;
      • 函数中的参数逗号后建议使用空格分隔;
      • 函数声明大括号之前建议使用空格分隔;
      • 在所有操作符的前后使用空格分隔,比如"=,+,-,>,||..."   

 

posted @ 2021-12-13 10:34  他乡踏雪  阅读(159)  评论(0编辑  收藏  举报