freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

編寫高質(zhì)量代碼改善javascript程序的188個(gè)建議-資料下載頁

2025-06-22 12:17本頁面
  

【正文】 用if條件語句對(duì)?運(yùn)算符表達(dá)式進(jìn)行分解?!猧f語句分解例如,對(duì)于下面這個(gè)復(fù)雜表達(dá)式,如果不仔細(xì)進(jìn)行分析,很難理清它的邏輯順序。1. var=newc(?(1):(1))在使用if條件語句后,邏輯結(jié)構(gòu)就變得非常清晰了。1. if(){ 2. var=newc((1))。 3. }else{ 4. var=newc((0))。 5. }建議14:不要濫用evaleval是一個(gè)被濫用得很嚴(yán)重的JavaScript特性。eval函數(shù)傳遞一個(gè)字符串給JavaScript編譯器,該字符串會(huì)被當(dāng)成一段 JavaScript 程序來解析和執(zhí)行。很多開發(fā)者對(duì)JavaScript語言一知半解,卻喜歡使用eval。例如,如果只知道點(diǎn)表示法,卻不知道下標(biāo)表示法,就會(huì)按如下方法編寫代碼:1. eval(value=obj.+key+)。而不是按如下方法編寫:1. value=obj[key]。使用eval形式的代碼會(huì)更加難以閱讀。這種形式將使代碼性能顯著降低,因?yàn)閑val必須運(yùn)行編譯器,同時(shí)這種形式減弱了Web應(yīng)用的安全性,因?yàn)樗虮磺笾档奈谋臼谟枇颂嗟臋?quán)限。使用eval與使用with語句一樣,降低了語言的性能。除了顯式調(diào)用 eval外,JavaScript 還支持隱式調(diào)用eval。Function構(gòu)造器是eval的另一種形式,所以也應(yīng)該避免使用它。當(dāng)傳遞的是字符串參數(shù)時(shí),setTimeout和setInterval函數(shù)(瀏覽器提供的函數(shù),能接受字符串參數(shù)或函數(shù)參數(shù))會(huì)像eval那樣去處理,因此也應(yīng)該避免使用字符串參數(shù)形式。例如,下面是使用函數(shù)參數(shù)形式進(jìn)行的處理。1. varobj={ 2. show1:function(){ 3. alert(時(shí)間到!)。 4. }, 5. show2:function(){ 6. alert(10秒一次的提醒!)。 7. }。 8. }。 9. setTimeout(,1000)。 10. setTimeout(()。,2000)。 11. setInterval(,10000)。 12. setInterval(()。,10000)。在Ajax應(yīng)用中,JSON是一種流行的瀏覽器端與服務(wù)器端之間傳輸數(shù)據(jù)的格式。服務(wù)器端傳過來的數(shù)據(jù)在瀏覽器端通過JavaScript的eval方法轉(zhuǎn)換成可以直接使用的對(duì)象。然而,在瀏覽器端執(zhí)行任意的 JavaScript會(huì)帶來潛在的安全風(fēng)險(xiǎn),惡意的JavaScript代碼可能會(huì)破壞應(yīng)用。對(duì)于這個(gè)問題,有兩種解決方法:帶注釋的 JSON(JSON ments filtering)。帶前綴的 JSON(JSON prefixing)。這兩種方法都是在Dojo中用來避免JSON劫持(JSON hijacking)的方法。帶注釋的JSON指的是從服務(wù)器端返回的JSON數(shù)據(jù)都是帶有注釋的,瀏覽器端的JavaScript代碼需要先去掉注釋的標(biāo)記,再通過eval 來獲得JSON數(shù)據(jù)。這種方法一度被廣泛使用,后來被證明并不安全,還會(huì)引入其他的安全漏洞。帶前綴的JSON是目前推薦使用的方法,這種方法的使用非常簡單,只需要在從服務(wù)器端返回的JSON字符串之前加上{} amp。amp。,再調(diào)用eval方法。關(guān)于這兩種方法的細(xì)節(jié),可參考。對(duì)JSON字符串進(jìn)行語法檢查,安全的JSON應(yīng)該是不包含賦值和方法調(diào)用的。在JSON的RFC 4627中,給出了判斷JSON字符串是否安全的方法,此方法通過兩個(gè)正則表達(dá)式來實(shí)現(xiàn)(代碼如下)。1. varmy_JSON_object=!(/[^,:{}\[\]09.\+Eaeflnru\n\r\t]/.test((/(\\.|[^\\])*/g,39。39。)))amp。amp。eval(39。(39。+text+39。)39。)。建議15:避免使用continuecontinue語句與break語句用法相似,在循環(huán)結(jié)構(gòu)中用于控制邏輯的執(zhí)行方向。break語句用于停止循環(huán),而continue語句卻用于再次執(zhí)行循環(huán)。與break語句語法相同,continue語句可以跟隨一個(gè)標(biāo)簽名,用來指定繼續(xù)執(zhí)行的循環(huán)結(jié)構(gòu)的起始位置。1. continuelabel。例如,在下面的這個(gè)示例中,當(dāng)循環(huán)變量等于4時(shí),會(huì)停止循環(huán)體內(nèi)最后一句的執(zhí)行,返回for語句起始位置繼續(xù)執(zhí)行下一次循環(huán)。1. for(vari=0。i10。i++){ 2. alert(i)。 3. if(i==4)continue。 4. alert(i)。 5. }不管continue語句是否帶有標(biāo)簽,都只能在循環(huán)結(jié)構(gòu)(如while、do/while、for、for/in)體內(nèi)使用,在其他地方都會(huì)引發(fā)編譯錯(cuò)誤。當(dāng)執(zhí)行continue語句時(shí),會(huì)停止當(dāng)前循環(huán)過程,開始執(zhí)行下一次的循環(huán)。但對(duì)于不同的結(jié)構(gòu)體,continue語句繼續(xù)執(zhí)行的位置會(huì)略有不同。在實(shí)踐中,通過代碼重構(gòu)移除continue語句會(huì)使性能得到改善。因此,在非必要條件下,建議不要使用continue語句。建議16:防止switch貫穿JavaScript語言中那些顯而易見的危險(xiǎn)或無用的特性不是最糟糕的,這些特性很容易被避免。最糟糕的特性像“帶刺的玫瑰”,它們是有用的,但也是危險(xiǎn)的。switch語句的由來可以追溯到FORTRAN IV的go to語句。除非明確地中斷流程,否則每次條件判斷后都貫穿到下一個(gè)case條件。switch語句的基本語法格式如下:1. switch(expression){ 2. statements 3. }完全擴(kuò)展后的switch結(jié)構(gòu)如下:1. switch(expression){ 2. caselabel: 3. statementList 4. caselabel: 5. statementList 6. ... 7. default: 8. statementList 9. }當(dāng)執(zhí)行switch語句時(shí),JavaScript解釋器首先計(jì)算expression表達(dá)式的值,然后使用這個(gè)值與每個(gè)case從句中l(wèi)abel標(biāo)簽值進(jìn)行比較,如果相同則執(zhí)行該標(biāo)簽下的語句。在執(zhí)行時(shí)如果遇到跳轉(zhuǎn)語句,則會(huì)跳出switch結(jié)構(gòu),否則按順序向下執(zhí)行,直到switch語句末尾。如果沒有匹配的標(biāo)簽,則會(huì)執(zhí)行default從句中的語句。如果沒有default從句,則跳出switch結(jié)構(gòu),執(zhí)行其后的句子。從ECMAScript v3版本開始允許case從句中可以是任意的表達(dá)式,這在C/C++和Java語言中是不允許的。switch語句的示例如下: 1. switch(a=3){ 2. case32: 3. alert(1)。 4. break。 5. case1+1: 6. alert(2)。 7. break。 8. caseb=3: 9. alert(3)。 10. }在switch語句中,case從句只是指明了想要執(zhí)行代碼的起點(diǎn),并沒有指明終點(diǎn),如果沒有向case從句中添加break語句,則會(huì)發(fā)生連續(xù)貫穿現(xiàn)象,從而忽略后面case從句,這樣就會(huì)造成switch結(jié)構(gòu)的邏輯混亂。不過,如果是在函數(shù)中使用switch語句,還可以使用return語句來代替break語句,這兩個(gè)語句都可以終止switch語句,防止case從句之間發(fā)生邏輯貫穿。建議17:塊標(biāo)志并非多余if、while、do或for語句可以接受一個(gè)括在大括號(hào)中的代碼塊,也可以接受單行語句。單行語句的形式是另一種“帶刺的玫瑰”。它的好處是可以節(jié)省兩個(gè)字節(jié),但是它模糊了程序的結(jié)構(gòu),在隨后的操作中可能產(chǎn)生問題,例如:1. if(0) 2. if(1) 3. alert(1)。 4. else 5. alert(0)。如果不借助代碼版式,很難明白以上代碼的邏輯結(jié)構(gòu)。而JavaScript解釋器會(huì)根據(jù)if關(guān)鍵字與else關(guān)鍵字最近原則按如下結(jié)構(gòu)進(jìn)行解釋。1. if(0) 2. if(1) 3. alert(1)。 4. else 5. alert(0)。如果其中子結(jié)構(gòu)中包含多行語句,這個(gè)問題就比較麻煩了,甚至?xí)霈F(xiàn)執(zhí)行錯(cuò)誤的情況。因此,為了避免嵌套的條件結(jié)構(gòu)發(fā)生混亂,應(yīng)該使用大括號(hào)語法來分隔代碼塊,例如:1. if(0){ 2. if(1){ 3. alert(1)。 4. } 5. } 6. else{ 7. alert(0)。 8. }嚴(yán)格遵循規(guī)范,并始終使用代碼塊,會(huì)使代碼更容易理解。建議18:比較function語句和function表達(dá)式在JavaScript語言中,既有function語句,也有函數(shù)表達(dá)式,這是令人困惑的,因?yàn)樗鼈兛雌饋硎窍嗤?。一個(gè)function語句就是值為一個(gè)函數(shù)的var語句的簡寫形式。下面的語句:1. functionf(){}相當(dāng)于:1. varf=function(){}這里建議使用第二種形式,因?yàn)樗苊鞔_表示f是一個(gè)包含一個(gè)函數(shù)值的變量。要用好JavaScript這門語言,理解函數(shù)就是數(shù)值是很重要的。function語句在解析時(shí)會(huì)被提升,這意味著不管function被放置在哪里,它都會(huì)被移動(dòng)到定義時(shí)所在作用域的頂層。這放寬了函數(shù)必須先聲明后使用的要求,當(dāng)然這也會(huì)造成混亂。在if語句中也是禁止使用function語句的。大多數(shù)的瀏覽器都允許在if語句中使用function語句,但它們?cè)诮馕鰂unction語句的處理上各不相同,因此造成了可移植性方面的問題。根據(jù)官方的語法約定,一個(gè)語句不能夠以一個(gè)函數(shù)表達(dá)式開頭,而以單詞function開頭的語句是一個(gè)function語句。解決這個(gè)問題的方法就是把函數(shù)表達(dá)式括在一個(gè)圓括號(hào)之中。1. (function(){ 2. //… 3. }())。建議19:不要使用類型構(gòu)造器在默認(rèn)狀態(tài)下,JavaScript預(yù)定義了很多構(gòu)造函數(shù),如Function()、Array()、Date()、string()等,如果去掉小括號(hào),它們就是JavaScript內(nèi)置對(duì)象。在JavaScript中,構(gòu)造函數(shù)實(shí)際上就是類的一種抽象結(jié)構(gòu)。利用new運(yùn)算符調(diào)用構(gòu)造函數(shù),可以快速生成很多實(shí)例對(duì)象。例如:1. varf=newFunction(p1,p2,...,pn,body)。其中構(gòu)造函數(shù)Function()的參數(shù)類型都是字符串,p1~pn表示所創(chuàng)建函數(shù)的參數(shù)名稱列表,body表示所創(chuàng)建函數(shù)的函數(shù)結(jié)構(gòu)體語句,在body語句之間通過分號(hào)進(jìn)行分隔??梢酝耆÷运袇?shù),僅為構(gòu)造函數(shù)傳遞一個(gè)字符串,用來表示函數(shù)的具體結(jié)構(gòu)。f就是所創(chuàng)建函數(shù)的名稱。例如:1. varf=newFunction(a,b,returna+b)。使用new Function()的形式來創(chuàng)建一個(gè)函數(shù)不是很常見,因?yàn)橐粋€(gè)函數(shù)體通常會(huì)包括多條語句,如果將這些語句以一個(gè)字符串的形式作為參數(shù)來傳遞,代碼的可讀性會(huì)很差。類似的用法還有: 1. newBoolean(false)new運(yùn)算符調(diào)用函數(shù)會(huì)返回一個(gè)對(duì)象,該對(duì)象有一個(gè)valueof方法,同時(shí)返回被包裝的函數(shù),其實(shí)這是完全沒有必要的,并且有時(shí)還令人困惑。不要使用new Boolean、new Number或new String。此外,應(yīng)該避免使用new Object和new Array,可以使用{}和[]來代替。在其他語言中,構(gòu)造函數(shù)一般沒有返回值,它只是初始化由this關(guān)鍵字所指代的對(duì)象,并且什么都不返回。但是,JavaScript構(gòu)造函數(shù)可以返回一個(gè)對(duì)象,返回的對(duì)象將成為new運(yùn)算符的運(yùn)算值,此時(shí)this所引用的對(duì)象就會(huì)被覆蓋。1. functionF(){ 2. =1。 3. return{y:2}。 4. } 5. varf=newF()。 6. 。//2上面示例演示了如何使用返回的對(duì)象覆蓋構(gòu)造函數(shù)的實(shí)例對(duì)象,但是,如果返回值是原始值時(shí),就不會(huì)覆蓋實(shí)例化對(duì)象,此時(shí)按著普通函數(shù)的方式調(diào)用構(gòu)造函數(shù)就可以得到返回值。 例如: 1. functionF(){ 2. =1。 3. returntrue。 4. } 5. varf=newF()。 6. 。//1 7. F()。//true因此,如果構(gòu)造函數(shù)的返回值為對(duì)象,可以直接調(diào)用構(gòu)造函數(shù)來引用該返回值對(duì)象,而不需要使用new運(yùn)算符來運(yùn)算。建議20:不要使用new通過new運(yùn)算符將創(chuàng)建一個(gè)繼承于其運(yùn)算數(shù)的原型的新對(duì)象,然后調(diào)用該運(yùn)算數(shù),把新創(chuàng)建的對(duì)象綁定給this。這給了運(yùn)算數(shù)(它應(yīng)該是一個(gè)構(gòu)造器函數(shù))一個(gè)機(jī)會(huì),在返回給請(qǐng)求者前去自定義新創(chuàng)建的對(duì)象。如果忘記使用new運(yùn)算符,得到的就是一個(gè)普通的函數(shù)調(diào)用,并且this被綁定到全局對(duì)象,而不是新創(chuàng)建的對(duì)象。這意味著當(dāng)函數(shù)嘗試去初始化新成員時(shí),它將會(huì)“污染”全局變量,這是一件非常糟糕的事情,既沒有編譯時(shí)警告,也沒有運(yùn)行時(shí)警告。按照慣例,結(jié)合new運(yùn)算符使用的函數(shù)應(yīng)該被命名為首字母大寫的形式,并且首字母大寫的形式應(yīng)該只用來命名那些構(gòu)造器函數(shù)。這個(gè)約定提供了一個(gè)視覺線索,以幫助發(fā)現(xiàn)那些JavaScript語言自身經(jīng)常忽略卻需要付出昂貴代價(jià)的錯(cuò)誤。一個(gè)更好的應(yīng)對(duì)
點(diǎn)擊復(fù)制文檔內(nèi)容
試題試卷相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1