亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

JS編碼技巧:翻譯的14天JS編寫技巧

2024-09-06 12:41:01
字體:
來源:轉載
供稿:網友

寫任何編程代碼,不同的開發者都會有不同的見解。但參考一下總是好的,下面是來自 javascript toolbox 發布的 14條最佳js代碼編寫技巧 ,sofish翻譯(1,2)。

1. 總是使用 ‘var’

在javascript中,變量不是全局范圍的就是函數范圍的,使用”var”關鍵詞將是保持變量簡潔明了的關鍵。當聲明一個或者是全局或者是函數級(function-level)的變量,需總是前置”var”關鍵詞,下面的例子將強調不這樣做潛在的問題。

不使用 var 造成的問題

var i=0; // this is good - creates a global variable
function test() {
   for (i=0; i<10; i++) {
      alert("hello world!");
   }
}
test();
alert(i); // the global variable i is now 10!

因為變量函數中變量 i 并沒有使用 var 使其成為函數級的變量,在這個例子中它引用了全局變量??偸鞘褂?var 來聲明全局變量是一個很多的做法,但至關重要的一點是使用 var 定義一個函數范圍的變量。下面這兩個方法在功能上是相同的:

正確的函數

function test() {
   var i=0;
   for (i=0; i<10; i++) {
      alert("hello world!");
   }
}

正確的函數

function test() {
   for (var i=0; i<10; i++) {
      alert("hello world!");
   }
}

2. 特性檢測而非瀏覽器檢測

一些代碼是寫來發現瀏覽器版本并基于用戶正使用的客戶端的對其執行不同行為。這個,總的來說,是一個非常糟的實踐。更好的方法是使用特性檢測,在使 用一個老瀏覽器可能不支持的高級的特性之前,首先檢測(瀏覽器的)是否有這個功能或特性,然后使用它。這單獨檢測瀏覽器版本來得更好,即使你知道它的性 能。你可以在 http://www.jibbering.com/faq/faq_notes/not_browser_detect.html 找到一個深入討論這個問題的文章。

例子:

if (document.getelementbyid) {
   var element = document.getelementbyid('myid');
}
else {
   alert('your browser lacks the capabilities required to run this script!');
}

|||

3. 使用方括號記法

當訪問由執行時決定或者包括要不能用”.”號訪問的對象屬性,使用方括號記法。如果你不是一個經驗豐富的javascript程序員,總是使用方括號是一個不錯的做法

對象的屬性由兩種固定的方法來訪問:”.”記法和”[ ]“方括號記法:

“.”號記法

myobject.property“[ ]“

方括號記法

myobject["property"]

使用”.”號,屬性名是硬代碼,不能在執行時改變。使用”[ ]“方括號,屬性名是一個通過計算屬性名而來的字符串。字符串要以是硬代碼,也可能是變量,甚至可以是一個調回一個字母串值的函數。 如果一個屬性名在執行產生,方括號是必須,如果你有 “value1′, “value2′, 和 “value3′這樣的屬性,并且想利用變量 i=2來訪問。

這個可以運行

myobject["value"+i]

這個不可以

myobject.value+i

并且在某些服務器端環境(php、struts等)下,form 表單被附加了 [ ] 號來表示 form 表單在服務器端必須被當作數組來對待。如此,用”.”號來引用一個包含 [ ] 號的字段將不會執行,因為 [ ] 是引用一個 javascript 數組的語法。所以,[ ] 號記法是必須的:

這個可以運行

formref.elements["name[]"]

這個不可以

formref.elements.name[]

推薦使用”[ ]“方括號記法是說當其需要時(明顯地)總是使用它。當不是嚴格需要使用它的時候,它是一個私人的偏好和習慣。一個好的經驗原則是,使用”.”號記法訪問標準的對象屬性,使用”[ ]“方括號記法訪問由頁面定義的對象屬性。這樣,document["getelementbyid"]() 是一個完美可行的”[ ]“方括號記法用法,但 document.getelementbyid() 在語法上是首選,因為 getelementbyid 是一個 dom 規范中定義的一個標準文檔對象屬性?;旌鲜褂眠@兩個記法使哪個是標準對象屬性,哪個屬性名是由上下文所定義的,在代碼中顯得清晰明了:

document.forms["myformname"].elements["myinput"].value

這里,forms 是 document 的一個標準屬性,而表單名 myformname 則是由頁面所定義的。同時,elements 和 value 屬性都是由規范所定義的標準屬性。而 myinput 則是由頁面所定義的。這頁是句法讓人非常容易理解(代碼的內容),是一個推薦遵循的習慣用法,但不是嚴格原則。

|||

4. 避免 ‘eval’

在javascript中,eval()功能是一個在執行期中執行任意代碼的方法。在幾乎所有的情況下,eval 都不應該被使用。如果它出現在你的頁面中,則表明你所做的有更好的方法。舉一個例子,eval 通常被不知道要使用方括號記法的程序員所使用。

原則上,”eval is evil(eval是魔鬼)”。別使用它,除非你是一個經驗豐富的開發者并且知道你的情況是個例外。

5. 正確地引用表單和表單元素

所有的 html 表單都應該有一個 name 屬性。對于 xhtml 文檔來說,name 屬性是不被要求的,但 form 標簽中應有相應有 id 屬性,并必須用 document.getelementbyid() 來引用。使用像 document.forms[0] 這樣的索引方法來引用表單,在幾乎所有情況下,是一個糟糕的做法。有些瀏覽器把文檔中使用 form 來命名的元素當作一個可用的 form 屬性。這樣并不可靠,不應該使用。

下面這個例子用使用方括號和正確的對象引用方法來展示如何防止錯誤地引用一個表單的input:

正確引用表單 input

document.forms["formname"].elements["inputname"]

糟糕的做法:

document.formname.inputname

如果你要引用一個函數里的兩個表單元素,較好的做法是先引用這個form對象,并將其儲存在變量中。這樣避免了重復查詢以解決表單的引用:

var formelements = document.forms["mainform"].elements;
formelements["input1"].value="a";
formelements["input2"].value="b";

當你使用 onchange 或者其他類似的事件處理方法,一個好的做法是總是通過一個引來把 input 元素本身引用到函數中來。所有 input 元素都帶有一個對包含其在內的form表單有一個引用:

<input type="text" name="address" onchange="validate(this)">
function validate(input_obj) {
   // 引用包含這個元素的form
   var theform = input_obj.form;
   // 現在你可以不需要使用硬代碼來引用表單自身
   if (theform.elements["city"].value=="") {
      alert("error");
   }
}

通過對表單元素的引用來訪問表單的屬性,你可以寫一個不包含硬代碼的函數來引用這個頁面中任何一個有特定名的表單。這是一個非常好的做法,因為函數變得可重用。

避免 ‘with’

javascript 中的 with 聲明在一個作用域的前端插入一個對象,所以任何屬性/變量的引用將會倚著對象被首先解決。這通常被用作一個避免重復引用的快捷方法:

使用 with 的例子:

with (document.forms["mainform"].elements) {
   input1.value = "junk";
   input2.value = "junk";
}

但問題在于程序員并沒有方法來驗證 input1 或 input2 實際上已經被當作 form 元素數組的屬性來解決。它首先以為這些名來檢測屬性,如果找不到,它將會繼續(向下)檢測這個作用域。最后,它在全局對象中嘗試把input1 和 input2 作為一個全局對象來對待,而這以一個錯誤作為結尾。

變通的方法是:創建一個引用來減少引用的對象,并使用它來解決這些引用。

使用一個引用:

var elements = document.forms["mainform"].elements;
elements.input1.value = "junk";
elements.input2.value = "junk";

|||

7. 在錨點中使用 “onclick” 替代 “javascript: pseudo-protocol”

如果你想在 <a> 標簽中觸發javascript 代碼,選擇 onclick 而非 javascript: pseudo-protocol;使用 onclick 來運行的 javascript 代碼必須返回 ture 或者false(or an expression than evalues to true or false [這句要怎么翻譯呢? 我是這樣理解的:一個優先性高于true 或 false 的表達式])來返回標簽本身:如果返回 true,則錨點的 href 將被當作一個一般的鏈接;如果返回 false,則 href 會被忽略。這就是為什么”return false;” 經常被包含在 onclick 所處理代碼的尾部。

正確句法

<a href="javascript_required.html" onclick="dosomething(); return false;">go</a>

在這個實例中,”dosomething()” 函數(定義于頁面的某個角落)將在被點擊時調用。href 將永遠不會被啟用了javascript 的瀏覽器訪問。在你可以提醒javascript 是必須的、而用戶未啟用之的瀏覽器中,文檔 javascript_required.html 才會被加載。通常,當你確保用戶將會開啟 javascript 支持,為盡量簡化,鏈接將只包含 href=”#”。 而這個做法是不被鼓勵的。通常有一個不錯的做法是:可以提供沒用啟用 javascript 一個返回本地的頁面。

有時,眾多想要分情況來訪問一個鏈接。例如,當一個用戶要離開你的一個表單頁面,而想先驗證來確保沒有東西被改變。在這個情況下,你的 onclick 將會訪問一個返回詢問鏈接是否應該被遵循的函數:

有條件的鏈接訪問:

<a href="/" onclick="return validate();">home</a>
function validate() {
 return prompt("are you sure you want to exit this page?");
}

在這個實例中,validate() 函數必須只返回 ture 或 false。ture 的時候用戶將被允許問題 home 頁面,或 false 的時候鏈接不被訪問。這個例子提示確認(其行為),以訪問 ture 或 false,這完全由用戶點擊”確實”或者”取消”決定。

下面是一些”不應該”的例子。如果你在自己的頁面中看到下面這樣的代碼,這是不正確的,需要被修改:

什么是不應該做的

<a href="javascript:dosomething()">link</a>
<a href="#" onclick="dosomething()">link</a>
<a href="#" onclick="javascript:dosomething();">link</a>
<a href="#" onclick="javascript:dosomething(); return false;">link</a>

8. 使用一元 ‘+’ 號運算符使類型轉向number

在javascript中,”+”號運算符同時充當數學加號和連接符。這會在form表單的域值相加時出現問題,例如,因為javascript是 一個弱類型語言,form 域的值將會被當作數組來處理,而你把它們”+”一起的時候,”+”將被當成連接符,而非數學加號。

有問題的例子:

<form name="myform" action="[url]">
<input type="text" name="val1" value="1">
<input type="text" name="val2" value="2">
</form>
function total() {
 var theform = document.forms["myform"];
 var total = theform.elements["val1"].value + theform.elements["val2"].value;
 alert(total); // 這個將會彈出 "12", 但你想要的是 3!
}

解決這個問題,javascript 需要一個提示來讓它把這些值當做數字來處理。你可以使用”+”號來把數組轉換成數字。給變量或者表達式前置一個”+”號將會強制其當作一個數字來處理,而這也將使得數學”+”得以成功應用。

修改好的代碼

function total() {
 var theform = document.forms["myform"];
 var total = (+theform.elements["val1"].value) + (+theform.elements["val2"].value);
 alert(total); // this will alert 3
}

|||

9. 避免 document.all

document.all 是由microsoft 的 ie 所引進的,并不是一個標準的 javascript dom 特性。盡管大多數新的瀏覽器支持它以支持依賴于它的糟糕代碼,(而)還有很多瀏覽器是不支持的。

并沒有理由其他方法都不適用,而一個老的ie瀏覽器(<5.0)需要支持,而在javascript中使用 document.all 作為一個折衷方法。 你并不需要使用 document.all 來檢測其是不是ie瀏覽器,因為其他瀏覽器現在一般都支持。

只把 document.all 當做最后的選擇:

if (document.getelementbyid) {
 var obj = document.getelementbyid("myid");
}
else if (document.all) {
 var obj = document.all("myid");
}

一些使用 document.all 的原則:

  • 同嘗試其他方法
  • 當其作為最后的選擇
  • 當需要支持 5.0 版本以下的 ie 瀏覽器
  • 總是使用 “if (document.all) { }” 來查看是否支持.

10. 不要在腳本代碼塊中使用html注釋

在 javascript 的舊日子(1995)里,諸如 netscape 1.0 的一些瀏覽器并不支持或認識 <script>標簽。所以,當 javascript 第一次被發布,需要有一個技術來讓實些代碼不被當做文本顯示于舊版瀏覽器上。有一個”hack” 是在代碼中使用 html 注釋來隱藏這些代碼。

使 html 注釋并不好:

<script language="javascript">
<!--
   // code here
//-->
</script>

在今天,沒有任何一個常用的瀏覽器會忽略掉 <script> 標簽。因此,再沒必要隱藏 javascript 源代碼。事實上,它還可以因為下面的理由,被認為是無益的:

  • 在 xhtml 文檔中,源代碼將向所有瀏覽器隱藏并被渲染成無用的(內容);
  • 在 html 注釋并不允許 ,這個會讓任何遞減操作將失效。

11. 避免亂用全局命名空間

一般很少需要全部變量和函數。全局使用將可能導致 javascript 源文件文檔沖突,和代碼中止。因此,一個好的做法是在一個全局命名空間內采用函數性的封裝。有多個方法可以完成這個任務,有此相對比較復雜。最簡單的方法 是創建一個全局對象,并把屬性和方法指派給這個對象:

創建一個命名空間:

var mylib = {}; // global object cointainer
mylib.value = 1;
mylib.increment = function() { mylib.value++; }
mylib.show = function() { alert(mylib.value); }
mylib.value=6;
mylib.increment();
mylib.show(); // alerts 7

命名空間也可以使用 closures(閉包?) 來創建,并且 private member variables (私有變量?) 也可以偽裝于 javascript中。

12. 避免同步的 ‘ajax’ 調用

當使用”ajax”請求時,你要么選擇異步模式,要么使用同步模式。當瀏覽器行為可以繼續執行,異步模式將請求放在后臺執行,同步模式則會等待請求完成后才繼續。

應該避免同步模式做出的請求。這些請求將會對用戶禁用瀏覽器,直至請求返回。一旦服務器忙,并需要一段時間來完成請求,用戶的瀏覽器(或者 os)將不能做任何其他的事,直至請求超時。

如果你覺得自己的情況需要同步模式,最大的可能是你需要時間來重新想一下你的設計。很少(如果有的話)實際上需要同步模式的 ajax 請求。

13. 使用 json

當需要將數據結構存儲成純文本,或者通過 ajax 發送/取回數據結構,盡可能使用 json 代替 xml。json (javascript object notation) 是一個更簡潔有效的數據存儲格式,并且不依賴任何語言(and is a language-neutral)。

14. 使用正確的 <script> 標簽

不造成在 <script> 中的使用language 屬性。一個合適的方式是創建如下的 javascript 代碼塊:

<script type="text/javascript">
// code here
</script>

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色婷婷久久av| 美女扒开尿口让男人操亚洲视频网站| 日韩欧美精品网站| 不卡在线观看电视剧完整版| 92版电视剧仙鹤神针在线观看| 国产精品草莓在线免费观看| 亚洲欧美国产一区二区三区| 久久亚洲精品一区二区| 亚洲a一级视频| 91在线网站视频| 91高潮精品免费porn| 日韩一区二区欧美| 国产午夜精品一区二区三区| 欧美电影电视剧在线观看| 日韩亚洲第一页| 亚洲国产精品一区二区久| 欧美中文在线观看| 久久伊人色综合| 国产在线一区二区三区| 欧美激情精品久久久久久大尺度| 国产精品极品美女在线观看免费| 久久艹在线视频| 久久伊人精品一区二区三区| 亚洲qvod图片区电影| 国产成人97精品免费看片| 精品久久久国产精品999| 欧美成人小视频| 久久久久久久久综合| 51午夜精品视频| 欧美日韩国产精品专区| 欧美www视频在线观看| 欧美午夜片在线免费观看| 91精品成人久久| 在线观看精品自拍私拍| 一区二区三区国产在线观看| 久久亚洲精品网站| 国产精品久久久久久久久久ktv| www.日本久久久久com.| 亚洲午夜未满十八勿入免费观看全集| 亚洲国产毛片完整版| 亚洲国产精品久久久久秋霞蜜臀| 国产一区二区三区18| 欧美大片大片在线播放| 国产精品一区二区电影| 久久久999精品免费| 深夜福利91大全| 欧美wwwxxxx| 国产精品吴梦梦| 亚洲国产日韩精品在线| 国产亚洲欧美另类中文| 亚洲图片制服诱惑| 国产日韩亚洲欧美| 亚洲高清一二三区| 久久久久久久久久久久久久久久久久av| 欧美在线欧美在线| 91日韩在线视频| 欧美激情视频播放| 性夜试看影院91社区| 欧美中文字幕在线观看| 92裸体在线视频网站| 日本欧美在线视频| 97久久精品在线| 精品国产91久久久| 久久精品夜夜夜夜夜久久| 国产精品青青在线观看爽香蕉| 91免费国产网站| 成人免费视频xnxx.com| xxxx欧美18另类的高清| 欧美日韩午夜剧场| 国产精品香蕉在线观看| 国产精品久久久久不卡| 成人网欧美在线视频| 91a在线视频| 伊人久久久久久久久久久久久| 国模精品视频一区二区三区| 国产激情久久久| 欧美日韩xxxxx| 国产精品丝袜高跟| 国产精品久久久久久久久免费看| 国产一区二区三区四区福利| 97成人在线视频| 久久人人爽亚洲精品天堂| 中文在线资源观看视频网站免费不卡| 日本aⅴ大伊香蕉精品视频| 久久久久久高潮国产精品视| 91免费版网站入口| 久久久久久久久久av| 欧美激情精品久久久久久免费印度| 国产精品久久久久久久久久久久久| 亚洲精品成人av| 日韩成人激情影院| 国产69精品久久久久9| 国产精品成人免费电影| 国产精品嫩草影院久久久| 国产视频精品va久久久久久| 色悠悠久久88| 国产精品爱久久久久久久| 欧美又大粗又爽又黄大片视频| 91亚洲精品一区| 亚洲成人激情图| 国产91在线播放精品91| 国产亚洲一区二区在线| 国产自摸综合网| 欧美在线亚洲一区| 国产精品久久99久久| 这里只有精品在线观看| 国产综合色香蕉精品| 成人福利免费观看| 超碰91人人草人人干| 成人精品一区二区三区电影免费| 国产视频综合在线| 国产精品91一区| 欧美激情精品久久久久久久变态| 国产精品久久久久久久久免费看| 北条麻妃在线一区二区| 亚洲乱亚洲乱妇无码| 国产乱肥老妇国产一区二| 久久色在线播放| 欧美激情视频播放| 欧美性猛交xxxxx水多| 色综合久久中文字幕综合网小说| 亚洲free性xxxx护士白浆| 亚洲3p在线观看| 日韩的一区二区| 美日韩精品免费视频| 国产一区二区色| 欧美中文字幕在线视频| 国产999视频| 亚洲激情 国产| 国产精品高潮呻吟久久av无限| 午夜精品久久久久久久久久久久久| 亚洲第一av在线| 久久精品美女视频网站| 日韩在线观看电影| 精品久久中文字幕| 欧美大片在线看| 性欧美xxxx视频在线观看| 色综合男人天堂| 深夜福利日韩在线看| 亚洲男人第一av网站| 8090成年在线看片午夜| 中文字幕日韩欧美| 亚洲一区二区三区乱码aⅴ| 久久久久久成人| 亚洲一区二区三区在线视频| 中文一区二区视频| 亚洲一区第一页| 97在线精品国自产拍中文| 亚洲精品视频网上网址在线观看| 88国产精品欧美一区二区三区| 在线日韩日本国产亚洲| 国产在线一区二区三区| 成人中文字幕+乱码+中文字幕| 欧美一级视频一区二区| 国产精品欧美一区二区三区奶水| 国产午夜精品免费一区二区三区| 日韩视频―中文字幕| 久久综合伊人77777蜜臀| 国产成人小视频在线观看| 午夜精品一区二区三区在线视| 亚洲欧美色图片| 伊人久久免费视频| 国产脚交av在线一区二区| 欧美激情女人20p|