2016-05-31 210 views
2

我想知道是否有可能從函數返回一個「break」成循環; 基本上是這樣的:是否有可能從函數返回中斷/停止循環?

var foo = function(n){ 
    if(n > 10){ return break; } 
    else{ 
     console.log(n); 
    } 
} 
loop: 
    for(var i = 0; i<1000000; i++){ 
     foo(i); 
    } 

是否有可能從foo()內停止在i=11循環?我能以某種方式返回休息,休息一下,傳遞一個循環標籤並打破它? 我想這到底是什麼休息和如何執行。

我知道這裏有簡單的方法;我只是想更好地理解。 所以基本上「」「是否有可能打破‘循環’11沒有做內部的任何邏輯‘環路’‘’」

+0

'「return break;」'???或''return;' – Tushar

+0

替換'「return break;」'用真正打破循環的東西; – lonewarrior556

+1

'return「break」'可能嗎? –

回答

2

我能以某種方式返回一個休息時間,休息一下,傳遞一個循環標籤並打破它?我想這到底是什麼突破和如何執行。

不,你不能。

函數只能return值或throw的值(或掛起無限期地,要準確)。沒有其他方式可以離開功能。

標籤在模塊,腳本和函數體等級上工作。無法通過breakcontinue陳述跨越這些界限。此外,語法規則確保在每一個模塊,腳本或功能

  • 沒有標記語句包含具有相同名稱的另一個標記語句
  • 沒有一個名字break/continue聲明適當的標記語句外發生與標籤命名
  • 發生適當的聲明的之外沒有無名break/continue語句(例如環或開關塊)

每六這些規則的誇大是語法錯誤。

這樣,當執行腳本/模塊/函數體並在某處滿足語句時,控制流將向上引導,留下當前語句,直到滿足相應標籤。這個控制流然後繼續的標記語句必須在同一個腳本/模塊/函數內。

作爲一個原因,只要想到foo不是從您的loop:循環內部調用的,而是從標籤語句之外的某個地方調用的。這是一個運行時錯誤?在撥打電話foo()或撥打break時?或者,如果沒有找到相應名稱的標籤,break聲明會繼續嗎?

+0

謝謝。儘管在javascript中工作時會感到奇怪的被告知「不,你不能這樣做」。 – lonewarrior556

+0

那麼,你不能這樣做任何其他明智的語言,沒有'goto' :-) – Bergi

0
var foo = function(n){ 
    if(n > 10){ 
     return false; 
    } 
    else{ 
    console.log(n); 
    return true; 
    } 
} 

for(var i = 0; i<1000000; i++){ 
    if (!foo(i)) break; 
} 

試試這個代碼,看看它是否工作。

+3

雖然這有效,但我認爲OP正在尋找關於函數如何返回值以及如何在循環上下文中評估值的更完整說明。 –

-1

你不能返回一個「突破」,但環路知道如何尋找你可以返回一個標記值。在下面的例子中,如果foo(i)返回truthy值,循環結束:

var foo = function(n){ 
    if (n > 10) { 
     return true; 
    } 
    else{ 
     console.log(n); 
    } 
} 

var breakLoop = false; 
for(var i = 0; i<1000000 && !breakLoop; i++){ 
    breakLoop = !!foo(i); 
} 
1

可以使用突破這樣的:

for(var i=0; i<100; i++) { 
    if(i > 10) break; 
    console.log(i); 
} 

這樣的:

outside: for(var i=0; i<100; i++){ 
    inside: for(var j=0; j<100; j++) { 
     if(i>10 && j>10) break; 
     console.log(i, j); 
    } 
} 

或者是這樣的:

bigger: { 
    smaller: { 
     if(i>10) break bigger; 
    } 
} 

,但你水溼不喜歡這樣寫道:

for(var i=0; i<100; i++){ 
    (function(i){ 
     if(i > 10) break; 
    })(i); 
} 

因爲關鍵字突破可以在迴路,開關,或標籤語句只使用了同一範圍內