標籤:
跳躍陳述式,從名稱上就可以看出,它使得Javascript的執行可以從一個位置跳轉到另一個位置。break語句是跳轉到迴圈或者其他語句的結束,continue語句是終止本次迴圈的執行並開始下一次迴圈的執行。Javascript中的語句可以命名或帶有標籤,break和continue可以標識目標迴圈或者其他語句標籤。
return語句讓解譯器跳出函數體的執行,並提供本次調用的傳回值。throw語句觸發或者拋出一個異常,它是與try/catch/finally語句一同使用的,這些語句指定了處理異常的代碼邏輯。這是一種複雜的跳躍陳述式,當拋出一個異常的時候,程式將跳轉至最近的閉合例外處理常式,這個例外處理常式可以是在同一個函數中或者在更高層的調用棧中。
(1)標籤語句
語句是可以添加標籤的,標籤是由語句前的標識符和冒號組成。
identifier:statement;
通過給語句定義標籤,就可以在程式的任何地方通過標籤名引用這條語句。也可以對多條語句定義標籤,儘管只有在給語句塊定義標籤時它才更有用,比如迴圈和條件判斷語句。通過給迴圈定義一個標籤名,可以在迴圈體內部使用break和continue來退出迴圈或者直接跳轉到下一個迴圈的開始。break和continue是Javascript中唯一可以使用語句標籤的語句,
continue語句使用了這個標籤:
mainloop:while(token != null){ //忽略這裡的代碼 continue mainloop; //跳轉到下一次迴圈 //忽略這裡的代碼}
這裡用做標籤的identifier必須是一個合法的javascript標識符,不能是保留字。
標籤的命名空間和變數或函數的命名空間是不同的,因此可以使用同一個標識符作為語句標籤和作為語句標籤和作為變數名或函數名。
語句標籤只有在它起作用的語句(當然也可以在它的子句中)內是有定義的。一個語句標籤不能和它內部的語句標籤重名,但在兩個程式碼片段不相互嵌套的情況下是可以出現同名的語句標籤的。
帶有標籤的語句還可以帶有標籤,也就是說,任何語句都可以有很多個標籤。
(2) break語句
單獨使用break語句的作用是立即退出最內層的迴圈或switch語句。它的文法如下:
break;
由於它能夠使迴圈和switch語句退出,因此這種形式的break只有出現在這類語句中才是合法的。
在迴圈中,無論出於什麼原因,只要不想繼續執行整個迴圈,就可以使用break來提前退出。當迴圈終止條件非常複雜時,在函數體內使用break語句實現這些條件判斷的做法要比直接在迴圈運算式中寫出這個複雜終止條件的做法簡單很多。
下面的例子中,迴圈遍曆整個數組元素來尋找某個特定的值,當整個數組遍曆完成後會正常退出迴圈,如果找到了需要尋找的數組元素,則使用break語句退出迴圈。
for(var i = 0; i<a.length; i++){ if(a[i] == target) break;}
JavaScript中同樣允許break關鍵字後面跟隨一個語句標籤(只有標識符,沒有冒號):
break labelname;
當break和標籤一塊使用時,程式將跳轉到這個標籤所標識的語句塊的結束,或者直接終止這個閉合語句快的執行。當沒有任何閉合語句塊指定了break所用的標籤,這時會產生一個語法錯誤。當使用這種形式的break語句時,帶標籤的語句不應該是迴圈或者switch語句,因為break可以“跳出”任何閉合的語句塊。這裡的語句可以是由花括弧括起來的一組語句,使用同一個標籤來表示這一組語句。
在break關鍵字和labelname之間不能換行。因為javascript可以給語句自動補全省略掉的分號,如果break關鍵字和標籤之間有換行,Javascript解譯器會認為你在使用break不帶標籤的最簡形式,因此會在break後補充分號。
當你希望通過break來跳出非就近的迴圈體或者switch語句時,就會用到帶標籤的break語句,下面是個例子:
var matrix = getData(); //從某處得到一個二維數組//將矩陣中所有元素進行求和var sum = 0,success = false;//從標籤名開始,以便在報錯時退出程式compute_sum: if(matrix){ for(var x =0;x<matrix.length;x++){ var row = matrix[x]; if(!row) break compute_sum; for(var y = 0; y<row.length; y++){ var cell = row[y]; if(isNaN(cell)) break compute_sum; sum += cell; } } success = true;}//break語句跳轉至此//如果在success == false的條件下到達這裡,說明我們給出的矩陣中有錯誤//否則將矩陣中所有的元素進行求和
最後,需要注意的是,不管break語句帶不帶標籤,它的控制權都無法越過函數的邊界。比如,對於一條帶標籤的函數定義語句來說,不能從函數內部通過這個標籤來跳轉到函數外部。
Javascript跳躍陳述式