由于javascript语言的特点,我们可编写各种编程风格的代码,从传统的面向对象式到声明式到函数式。形成一套良好的javascript代码书写约定可大大提高可维护性,这点对初学者来说绝对是没有很注重的地方。
var car,person; //声明两个变量
如上代码,由于javascript中变量是松散类型的,我们并不知道其中的car和person是什么类型的数据,不够透明,我们可以通过一下两种方式缓解这种问题:
初始化变量:通过初始化指定变量类型,但通过这种方式命名的对象无法用于函数声明中的参数。
var car = null; //car是对象 var person = ''; //person是字符串 var count = -1; //count是整数 var found = false; //found是布尔型
匈牙利标记法:在变量名之前加上一个或多个字符表示数据类型。o - 对象,s - 字符串,i - 整数,f - 浮点数,b - 布尔型
var oCar; //car是对象 var sPerson; //person是字符串 var iCount; //count是整数 var bFound; //found是布尔型
记得以前刚入门C#的时候,师兄经常跟我说‘高内聚低耦合’这词,我也就含糊地点点头,很多人可能也像我之前一样,这词耳熟能详,但未真正实践。
只要应用的某个部分过分依赖另一部分,代码就是耦合过紧,难于维护! 典型的问题:对象直接应用另一个对象,并且修改其中一个的同时需要修改另一个。 在我们web应用中,我们可以通过一下方式解耦我们的代码:
在web应用中,我们希望html专注于展示数据,css专注于样式,javascript专注于行为交互。但是有一些代码会将html、javascript过于紧密地耦合在一起。
直接写在HTML中javascript,使用包含内联代码的<script>元素或者是使用HTML属性来分配事件处理程序。
<!--使用<script>标签的紧密耦合 --> <script type="text/javascript"> document.write('hello,javascript'); </script> <!--使用时间处理程序属性值的紧密耦合 --> <input type="button" value="click me" onclick="doSomething()"/>
虽然这样写完全正确,但出现javascript错误是,我们需要判断错误出现在HTML还是在Javascript中,并且这还存在一个时间差问题,当我按下上面代码的按钮时,若此时javascript代码并未加载完,此时变回引发错误。在实践中,理想的状况应该是HTML和Javascript应完全分离,使用引入外部文件来加载javascript。
相反地,在javascript中也不能包含过多的HTMl
function insertMsg(msg){ var container = document.getElementById('container'); container.innerHtml = '<div lcass=\"msg\"><p class=\"post\">' + msg + '</p></div>' }
当你在写这样的代码的时候,我想你应该去找个js模板引擎来了。
对动态生成的HTML,对书写CSS布局,定位错误都比较难把控。
上面说了,CSS和JS都应该各司其职,不能有太大的亲密动作,秀恩爱,死得快 囧~~~。
这个问题并不能说完全解耦css和js,因为在现代web应用中常常需要javascript来更改样式,但是我们还是尽量使他们分离。
// CSS对JS的紧密耦合 element.style.color = 'red'; element.style.backgroundColor= 'blue';
这样的代码在以后修改样式的时候需要同时修改CSS和JS,可麻烦了。
//这样就ok了 element.className = 'color'; //color是样式类
还有一个就是不能在CSS中写CSS表达式,这应该是都知道的了。
每个web应用程序都有相当多的事件处理程序,监听着大量不同的事件,然而,很少能有仔细将应用逻辑从事件处理程序中分离的,如下:
function checkValue(e){ e = e || window.event; var target = e.target || e.srcElement; if(target.value.length < 5){ //省略一堆逻辑处理代码... } }
将上面的代码重写为:
function checkValue(value){ if(value.length < 5){ //省略一堆逻辑处理代码... } } function handleBlur(e){ e = e || window.event; var target = e.target || e.srcElement; checkValue(target.value); //调用应用逻辑处理函数 }
这样写有什么好处呢?
在企业环境中创建的web应用往往同时由大量人员一同创作。在这种情况下的目标是确保每个人所使用的浏览器环境都有一致和不变的规则,因此,我们需要坚持一下的一些编程实践:
在一个js文件中,最多允许有一个全局变量,让其他对象和函数包含在其中,因为过多的全局变量会消耗大量内存。
//两个全局变量 var name = 'jozo'; function sayName(){ alert('jozo'); }
上面的代码有两个全局变量,变量name和函数sayName(),其实可以创建一个变量包含它们:
//一个全局变量 --推荐 var person = { name:'jozo', sayName : function(){ alert(this.name); } }
这样一个全局变量延伸开来就是‘空间的概念’了,不会与其他功能产生冲突,有助于消除功能作用域之间的混淆。
function sortArray(values){ if(values != null){ values.sort(比较函数); } }
上面代码中的if语句应该检测values是否是数组,但如果与null作比较的话,字符串,数字等都会通过,导致函数抛出错误。这里是数组,那么我们就应该检测其是否为数组:
function sortArray(values){ if(values instanceof Array){ values.sort(比较函数); } }
所于当我们遇到与null作比较的代码的时候,我们应该用下面的技术替换:
function validate(value){ if(!value){ alert('不存在'); location.href = '/errors/invalid.php'; } }
现在,我想把‘不存在’改为‘该数据不存在!’,把跳转路径也改了,我得回到函数中找到对应的代码去修改,而每次修改逻辑代码,都有可能引入错误的风险。所以我们可以把数据单独定义为常量,与应用逻辑分离:
var Constans = { ERRORMSG: '不存在', ERRORPAGE:'/errors/invalid.php' }; function validate(value){ if(!value){ alert(Constans.ERRORMSG ); location.href = Constans.ERRORPAGE ; } }
这样我们修改静态文本内容的时候就无需去动逻辑函数了,甚至可以把Constans单独一个文件。那么什么样的数据需要抽出来做常量呢?
所有编程语言都需要可维护性良好的代码,这个很重要,因为大部分开发人员都花费大量时间维护他人的代码。为了减轻相互的负担,从今天起我要做个好人,写好代码! o(╯□╰)o