2013-06-12 26 views
15
開關罩內

什麼命令我必須使用,要走出的for循環,也是從//code inside跳直接到//code after歇循環從在Javascript

//code before 
for(var a in b) 
    { 
    switch(something) 
     { 
     case something: 
      { 
      //code inside 
      break; 
      } 
     } 
    } 
//code after 
+0

在switch語句的關閉'}'之後加上'break;'。 – War10ck

+3

你可能會考慮重構你的解決方案。 – Mahdi

+0

@JaakKütt永遠不要碰我的縮進樣式。 – BASILIO

回答

9

不幸的是,Javascript沒有允許break通過多個級別。要做到這一點,最簡單的方法是創建一個匿名函數來利用return語句的功率:

//code before 
(function() { 
    for (var a in b) { 
     switch (something) { 
     case something: 
      { 
       //code inside 
       return; 
      } 
     } 
    } 
}()); 
//code after 

這工作,因爲return離開的功能,因此隱退出循環,直動你code after

+0

我覺得像一個匿名函數是這種事情矯枉過正。另外,取決於for/switch的細節,我可能會略過代碼並看到一個'return',而不是將它與匿名函數關聯起來(稍後讓維護更加困惑)。現在,當然,這不是一段複雜的代碼,但是在整個實踐中應用這個代碼可能會變得很難。 –

+0

@BradChristie我不確定匿名函數是多麼大的一件大事!至於可讀性,這就是評論的意思,當然......重構可能是理想的,但這是離開循環的最簡潔的方式。 – lonesomeday

+0

沒有戲劇性,但我[仍然看到不同](http://jsperf.com/exiting-nested-switch-within-for-in)。 –

16

使用另一個變量來標記,當您需要退出:

var keepGoing = true; 
for (var a in b){ 
    switch (something){ 
    case something: 
     keepGoing = false; 
     break; 
    } 
    if (!keepGoing) break; 
} 

example

+2

@downvoter:什麼給?完全可以接受的(儘管'break'允許一個'label'參數,我個人認爲標籤與BASIC一起出現,並且導致[意大利麪代碼](http://en.wikipedia.org/wiki/Spaghetti_code)...) –

7

這取決於你想要完成的任務......有一件事我通常做的是這樣的:

//code before 
for(var a in b) 
{ 
    var breakFor = false; 
    switch(something) 
    { 
     case something: 
     { 
      //code inside 
      breakFor = true; 
      break; 
     } 
    } 
    if (breakFor) 
     break; 
} 
//code after 
+0

Jeff是第一個使用bool var來完成此操作的人,其他用戶使用相同的語句獲得更多upvotes。爲什麼? – Eduardo

11

您可以使用label。有標籤說明並打破該標籤。 outerLoop是我在此使用的標籤。

//code before 
outerLoop: 
for (var a in b) { 
    switch (something) { 
     case 'case1': 
      //code inside 
      break outerLoop; 
    } 
} 
//code after 
+0

可以使用'label'一次,但如果更頻繁地使用''標籤',那麼最終可能會產生一個意大利麪代碼。在這種情況下,我首先建議重構解決方案。 – Mahdi

0

我總是發現使用條件語句最簡單的方法來控制代碼流,至少在概念上。

var done = false; 
//code before for loop 
for(var a in b){ 
    switch(switchParameter){ 
     case firstCase: 
      //code inside 
      done = true; 
      break; 
     } 
    } 
    if(done) 
     break; 
} 
//code outside of for loop 
1

你可以知道哪個環路/開關斷開。

function foo() 
{ 
    dance: 
    for(var k = 0; k < 4; k++){ 
     for(var m = 0; m < 4; m++){ 
      if(m == 2){ 
       break dance; 
      } 
     } 
    } 
} 

參見this answer

0
for(var i=0; i<b.length; i++) { 
    switch (something) { 
     case 'something1': 
      i=b.length; 
    } 
} 

當迭代變量i到達循環結束時,它會中斷。但是可以強制迭代變量到達循環的結尾。

+0

這個代碼最好包含一些解釋,尤其是因爲還有其他六個答案。 – EJoshuaS

+0

這並不能解決問題,因爲當'i = b.length'時代碼會再運行1次。而且,如果'i'設置爲低於'b.length',那將是非常危險的,它將永遠運行!!!所以我建議我們應該用功能,標籤或標誌代替這個。 –