結(jié)構(gòu)化語句要始終使用區(qū)塊
下面這個(gè)例子是一個(gè)cookie類構(gòu)造器。它創(chuàng)建了一個(gè)有g(shù)et和set方法的對(duì)象。
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語言的相似:它能執(zhí)行一個(gè)語句或一個(gè)區(qū)塊。關(guān)于用語句的問題是一個(gè)普通的錯(cuò)誤非常難以探測(cè)。最好把
if ((e = c.indexOf(';', s)) == -1) e = c.length;
寫成
if ((e = c.indexOf(';', s)) == -1) { e = c.length; }
區(qū)塊的用處是避免了下面的情況:
if ((e = c.indexOf(';', s)) == -1) e = c.length; s += n.length + 2;
它將出現(xiàn)當(dāng)indexOf返回-1是,s是只被增加,但這不是實(shí)際情形。像這樣的bug被發(fā)現(xiàn)代價(jià)是非常高的,但是可以通過一直使用大括號(hào)聲明結(jié)構(gòu)來廉價(jià)的避免。
避免賦值表達(dá)式
Javascript從C繼承的另一個(gè)壞習(xí)慣是賦值表達(dá)式。它出現(xiàn)在流線型代碼中,但它能使控制流更難以理解。如果我們從他們的使用中分離了s和e的計(jì)算,get方法會(huì)變得更清晰。
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); }
我們現(xiàn)在能看到當(dāng)s被計(jì)算時(shí),在indexOf參數(shù)兩邊有多余的括號(hào)。(在return語句中也有非必須的括號(hào)。)但是更重要的是,能容易的看出if (e == -1)的目的是什么:如果cookie中末尾的分號(hào)不存在,假定cookie結(jié)束在字符串的末端。然而,當(dāng)我們計(jì)算c時(shí),我們?cè)赾ookie中加入了一個(gè)分號(hào),它保證了預(yù)料的if條件將絕不會(huì)發(fā)生。所以我們能移除if。
出處:隨網(wǎng)之舞
責(zé)任編輯:bluehearts
上一頁 Javascript風(fēng)格要素 [1] 下一頁 Javascript風(fēng)格要素 [3]
◎進(jìn)入論壇網(wǎng)頁制作、WEB標(biāo)準(zhǔn)化版塊參加討論,我還想發(fā)表評(píng)論。
|