首页 > 解决方案 > 为什么我的函数在遇到返回后执行剩余代码(在两个循环内返回)

问题描述

我不明白为什么这个函数会在应该调用 return 语句之后运行剩余的代码:

function func(i) {
while (i >= 0) {
if (i < 0) {    
    return;
    }    
    document.write("inside loop, i is  " + i);
    document.write("</br>");

i--;
} //end of while 
document.write("end of function, i is " + i);
document.write("</br>");
}
func(2);

输出:

inside loop, i is 2; 
inside loop, i is 1; 
inside loop, i is 0; 
end of function, i is -1; 

我期待:

inside loop, i is 2; 
inside loop, i is 1; 
inside loop, i is 0; 
  1. 如果应该在它之前调用返回,为什么要写“函数结束,i 是 -1”这一行?

  2. 如果我将 while(i >= 0) 替换为 while(true),则该函数会给出预期的输出(没有最后一个 document.write)。这是为什么?

  3. 如果我将 while 循环后的代码替换为:

    return document.write("end of function, i is " + i);
    document.write("end 2 of function, i is " + i);
    

最后一个代码行(函数的第 2 行, i is )未执行。为什么代码在第一次返回后继续执行,而不是在第二次返回后继续执行?

  1. 如果我从 if 语句中取出 return,则在调用 return 时函数停止:

    while (i >= 0) { 
      document.write("inside loop, i is  " + i);
      document.write("</br>");
      i--;
      return; 
    }
    

输出是:

inside loop, i is 2

为什么最后一个 document.write ("end of function, i is ") 在这种情况下不执行?

标签: javascriptfunctionloopsif-statementreturn

解决方案


你的while情况:

while (i >= 0) {

永远不会在测试为真的同时return为真:

if (i < 0) {    
  return;
}    

由于在循环顶部和测试i之间没有改变,因此永远不会实现。在最后一次迭代中,将在块结束之前从 0 递减到 -1 ,并且由于 an测试失败,因此不会运行进一步的迭代(并且不会遇到检查)。whilei < 0ifiwhilei-1whileifreturn

如果你让while循环无限期地继续,直到if语句完成,函数确实会返回:

function func(i) {
  while (true) {
    if (i < 0) {
      return;
    }
    document.write("inside loop, i is  " + i);
    document.write("</br>");

    i--;
  } //end of while 
  document.write("end of function, i is " + i);
  document.write("</br>");
}
func(2);

至于

  1. 如果在while循环之后,我将代码替换为:

    return document.write("end of function, i is " + i);
    document.write("end 2 of function, i is " + i);
    

  1. 如果我从 if 语句中取出 return,则在调用 return 时函数停止:

    while (i >= 0) { 
    ...
    return;
    

在这两种情况下,实际上都遇到了语句return,因此函数按预期在那里终止。(在您的原始代码中,解释器永远不会跨越,因为永远不会实现)returnif


推荐阅读