javascript的分號代表語句的結(jié)束符,但由于javascript具有分號自動插入規(guī)則,所以它是一個十分容易讓人模糊的東西,在一般情況下,一個換行就會產(chǎn)生一個分號,但實際情況卻不然,也就是說在javascript中換行可能產(chǎn)生分號,也可能不產(chǎn)生,是否自動插入分號,主要看上下行。所以即使是經(jīng)驗豐富的程序員,有時候也會頭大。
在 ECMAScript 中對分號自動插入規(guī)則也有相應(yīng)的解釋:空語句,變量語句,表達(dá)式語句,do-while 語句,continue 語句,break 語句,return 語句,以及 throw 語句,這些確定的ECMAScript語句必須以分號結(jié)束。這些分號可以總是明確地出現(xiàn)在源代碼文本中。為方便起見,在特定的情況下,源代碼文本中的這些分號可以被省略。也就是說這些語句的結(jié)尾是不需要硬性的輸入分號結(jié)尾,javascript會自動插入語句結(jié)束處。
想了解詳細(xì)的ECMAScript分號自動插入規(guī)則可以查看以下鏈接:
實踐出真理,看一下下面這些例子,就明白,分號自動插入不是那么好讓人捉摸的。稍微不注意就會讓你頭大。
return引起的血案
function test(){ var a = 1; var b = 2; return //會自動插入分號 ( a+b ) }; alert(test());
一個返回a+b值的函數(shù),初看沒任何問題,但運行alert的結(jié)果卻是undefined。根據(jù)分號的自動插入規(guī)則,return 語句后面如果有換行就會自動插入分號,沒有返回值也就比較好理解了。如果需要換行的話,可以這樣:
function test(){ var a = 1; var b = 2; return ( a+b ) }; alert(test());
兩個閉包引起的血案
(function (){ var a; })() //不會自動插入分號 (function (){ var b; })()
很詭異,解釋不了,誰能告訴我~
for語句頭中的兩個分號,不自動插入分號
for( var a=1,b=10 //不會自動插入分號 a<b //不會自動插入分號 a++ ) {}
ECMAScript對以上也有解釋:將分號解釋為空語句和在for語句中的()中不自動插入分號是特例,是不屬于自動插入規(guī)則管轄的。
javascript雖然是弱類型語言,ECMAScript的分號自動插入規(guī)則也讓人難以理解透徹。但養(yǎng)成良好的代碼書寫習(xí)慣,手動插入分號,養(yǎng)成習(xí)慣,就能避免這些問題,同時會在程序調(diào)試,代碼的閱讀上對自己對他人都有不小的幫助。
同時ECMAScript還給程序員一些忠告:
- ++ 或 — 應(yīng)和其操作數(shù)出現(xiàn)在同一行。
- return 或 throw 語句中的表達(dá)式應(yīng)和return 或 throw 出現(xiàn)在同一行。
- break 或 continue 語句中的標(biāo)簽應(yīng)和break 或 continue 出現(xiàn)在同一行。
本文鏈接:http://m.95time.cn/tech/web/2009/7261.asp
出處:藍(lán)色理想
責(zé)任編輯:bluehearts
◎進(jìn)入論壇網(wǎng)頁制作、WEB標(biāo)準(zhǔn)化版塊參加討論,我還想發(fā)表評論。
|