结构化语句要始终使用区块
下面这个例子是一个cookie类构造器。它创建了一个有get和set方法的对象。
function yg_cookie() { this.get = function (n) { var s, e, v = '', c = ' ' + document.cookie + ';'; if ((s = c.indexOf((' ' + n + '='))) >= 0) { if ((e = c.indexOf(';',s)) == -1) e = c.length; s += n.length + 2; v = unescape(c.substring(s, e)); } return (v); } this.set = function (n,v,e) { document.cookie = n + "=" + escape(v) + ";expires=" + (new Date(e * 1000)).toGMTString() + ";path=/" + ";domain=www.yahoo.com"; } } var _yc = new yg_cookie();
Javascript的if语句和C语言的相似:它能执行一个语句或一个区块。关于用语句的问题是一个普通的错误非常难以探测。最好把
if ((e = c.indexOf(';', s)) == -1) e = c.length;
写成
if ((e = c.indexOf(';', s)) == -1) { e = c.length; }
区块的用处是避免了下面的情况:
if ((e = c.indexOf(';', s)) == -1) e = c.length; s += n.length + 2;
它将出现当indexOf返回-1是,s是只被增加,但这不是实际情形。像这样的bug被发现代价是非常高的,但是可以通过一直使用大括号声明结构来廉价的避免。
避免赋值表达式
Javascript从C继承的另一个坏习惯是赋值表达式。它出现在流线型代码中,但它能使控制流更难以理解。如果我们从他们的使用中分离了s和e的计算,get方法会变得更清晰。
this.get = function (n) { var v = '', c = ' ' + document.cookie + ';', s = c.indexOf((' ' + n + '=')), e = c.indexOf(';', s); if (s >= 0) { if (e == -1) { e = c.length; } s += n.length + 2; v = unescape(c.substring(s, e)); } return (v); }
我们现在能看到当s被计算时,在indexOf参数两边有多余的括号。(在return语句中也有非必须的括号。)但是更重要的是,能容易的看出if (e == -1)的目的是什么:如果cookie中末尾的分号不存在,假定cookie结束在字符串的末端。然而,当我们计算c时,我们在cookie中加入了一个分号,它保证了预料的if条件将绝不会发生。所以我们能移除if。
出处:随网之舞
责任编辑:bluehearts
上一页 Javascript风格要素 [1] 下一页 Javascript风格要素 [3]
◎进入论坛网页制作、WEB标准化版块参加讨论,我还想发表评论。
|