我想知道是否可以退回"休息"从函数进入循环; 基本上是这样的:
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;
答案 0 :(得分:2)
我可以以某种方式返回休息,抛出一个休息,传递一个循环的标签并打破它吗?我想这确切地说明了它是什么以及它是如何执行的。
不,你不能。
一个函数只能 return
一个值或 throw
一个值(或者无限期挂起,确切地说)。没有其他方法可以留下一个功能。
标签适用于模块,脚本和功能体层。使用break
或continue
语句跨越这些边界是不可能的。此外,语法规则确保在每个模块,脚本或函数中
break
/ continue
语句的名称出现在带有该标签名称的适当标签语句之外break
/ continue
语句出现在适当的语句之外(例如循环或切换块)每次违反这些规则都是语法错误。
这样,当执行脚本/模块/函数体并在某处满足break
或continue
语句时,控制流将向上指向,保留当前语句,直到相应的标签得到满足。然后控制流继续的标记语句必须在相同的脚本/模块/函数内。
作为一个原因,只需要考虑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);
}