我是学控制理论出身,一个控制系统的鲁棒性,确实是在做系统设计时需要着重注意的。什么是控制系统的鲁棒性?
所谓“鲁棒性”,是指控制系统在一定(结构,大小)的参数摄动下,维持某些性能的特性(摘自百度百科……汗)。
在软件设计和开发中,同样也要时刻考虑提高鲁棒性。那么如何提高JavaScript程序的鲁棒性呢?我认为,RIA的鲁棒性,一般来讲,主要跟js的代码规范性和DOM操作有关系。下面我总结几点开发中需要注意的地方,让页面跑不死、不报错。这些事情可能在实际开发中都是小事,但是对于提高软件整体的鲁棒性,是非常critical的!
1. 严禁使用全局变量
唉,这个我可是亲身体会并深受其害啊!话说,当时我修改一个页面,开发一段脚本,需要写cookie。我发现页面上以前有人引用了一个js文件,里面有setCookie函数,好啊,拿来用!结果这个cookie死活都写不对。检查了半天,才发现这个页面引用的另外一个js文件也有一个setCookie函数,函数的参数和刚才那个不一样,而我调用的估计是这个函数!应该是之前的两个同事在同一个页面上自己搞自己的,结果竟然函数重名,而这两个函数都是全局的!设想一下,加入两个人都在全局范围内搞一个var i = 0; 那岂不是更加疯掉。
这个故事得到的教训,首先当然是同一个team的开发者应该多兼容并包,团结协作。其次呢,页面的js较多的时候,一定要有一个好的层次,避免全局变量。避免全局变量的一个方式是namespace。例如创建一个这样的程序结构:
var my_project = {
dom : {
get : function() {},
make : function() {} // etc。
},
cookie : {
get : function() {},
set : function() {},
remove : function() {}
},
util : {
// some project utilities
}
}
2. 多使用短路表达式
全局变量的部分说的有点多了,大概是因为老田我经历过那类痛苦吧。短路表达式就是&&和||,在这里用来提高鲁棒性。举两个例子,第一,要得到某div节点的第一个节点的nodeName:
var div = document.getElementById("div_id");
var node_name;
if (div && div.firstChild) { // 在用firstChild前,先判断div是否存在
node_name = div.firstChild.nodeName;
}
第二,用||来快速解决一些浏览器兼容性问题:
// 得到元素内文本的跨浏览器解决方案
var text = span.innerText || span.textContent || "";
再例,用||来设置默认值:
// 设置默认值
var my_attr = span.getAttribute("my_attr") || default_value;
3. 操作元素前,首先判断其存在;
4. 良好的代码缩进和格式;return {}
Doug Crockford,《JavaScirpt: The Good Parts》的作者,在给Google做演讲的时候,详细分析了代码格式的重要性。比如:
return
{
pos_x : x,
pos_y : y
}
5. 使用跨浏览器的代码;
6. 变量尽早定义;
7. 小心NodeList;
8. 使用===和!==;
9. 不用eval,不用with;我是学控制理论出身,一个控制系统的鲁棒性,确实是在做系统设计时需要着重注意的。什么是控制系统的鲁棒性?
所谓“鲁棒性”,是指控制系统在一定(结构,大小)的参数摄动下,维持某些性能的特性(摘自百度百科……汗)。
在软件设计和开发中,同样也要时刻考虑提高鲁棒性。那么如何提高JavaScript程序的鲁棒性呢?我认为,RIA的鲁棒性,一般来讲,主要跟js的代码规范性和DOM操作有关系。下面我总结几点开发中需要注意的地方,让页面跑不死、不报错。这些事情可能在实际开发中都是小事,但是对于提高软件整体的鲁棒性,是非常critical的!
1. 严禁使用全局变量
唉,这个我可是亲身体会并深受其害啊!话说,当时我修改一个页面,开发一段脚本,需要写cookie。我发现页面上以前有人引用了一个js文件,里面有setCookie函数,好啊,拿来用!结果这个cookie死活都写不对。检查了半天,才发现这个页面引用的另外一个js文件也有一个setCookie函数,函数的参数和刚才那个不一样,而我调用的估计是这个函数!应该是之前的两个同事在同一个页面上自己搞自己的,结果竟然函数重名,而这两个函数都是全局的!设想一下,加入两个人都在全局范围内搞一个var i = 0; 那岂不是更加疯掉。
这个故事得到的教训,首先当然是同一个team的开发者应该多兼容并包,团结协作。其次呢,页面的js较多的时候,一定要有一个好的层次,避免全局变量。避免全局变量的一个方式是namespace。例如创建一个这样的程序结构:
var my_project = {
dom : {
get : function() {},
make : function() {} // etc。
},
cookie : {
get : function() {},
set : function() {},
remove : function() {}
},
util : {
// some project utilities
不支持Flash
|