是否可以从函数返回中断/停止循环?

时间:2016-05-31 15:02:15

标签: javascript loops

我想知道是否可以退回"休息"从函数进入循环; 基本上是这样的:

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

是否可以在i=11内停止foo()的循环?我可以以某种方式返回一个休息,抛出一个休息,传递一个循环的标签并打破它? 我猜这到底是什么突破以及它是如何执行的。

我知道有很简单的办法解决这个问题;我只是想更好地理解。 所以基本上&#34;&#34;&#34;是否有可能打破&#34;循环&#34;在11没有做任何逻辑内部&#34;循环&#34; &#34;&#34;&#34;

4 个答案:

答案 0 :(得分:2)

  

我可以以某种方式返回休息,抛出一个休息,传递一个循环的标签并打破它吗?我想这确切地说明了它是什么以及它是如何执行的。

不,你不能。

一个函数只能 return 一个值或 throw 一个值(或者无限期挂起,确切地说)。没有其他方法可以留下一个功能。

标签适用于模块,脚本和功能体层。使用breakcontinue语句跨越这些边界是不可能的。此外,语法规则确保在每个模块,脚本或函数中

  • 没有标记的语句包含另一个具有相同名称的带标签的语句
  • 没有break / continue语句的名称出现在带有该标签名称的适当标签语句之外
  • 没有未命名的break / continue语句出现在适当的语句之外(例如循环或切换块)

每次违反这些规则都是语法错误。

这样,当执行脚本/模块/函数体并在某处满足breakcontinue语句时,控制流将向上指向,保留当前语句,直到相应的标签得到满足。然后控制流继续的标记语句必须在相同的脚本/模块/函数内。

作为一个原因,只需要考虑foo不是从loop:循环内部调用,而是从标记语句之外的某些地方调用。这会是运行时错误吗?在致电foo()时,还是在break点?或者如果没有找到带有相应名称的标签,break语句会继续吗?

答案 1 :(得分:1)

你可以像这样使用 break

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);
}

因为关键字 break 只能用于内部相同范围的循环,开关或标签语句。

答案 2 :(得分: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 :(得分:-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);
}