【问题标题】:Early exit from function?提前退出功能?
【发布时间】:2011-03-20 19:13:12
【问题描述】:

我有一个函数:

function myfunction() {
  if (a == 'stop')  // How can I stop the function here?
}

在 JavaScript 中有类似 exit() 的东西吗?

【问题讨论】:

  • 是停止执行还是返回?
  • @Ken Struys 有什么区别?据我了解,如果我返回,它会停止执行吗?不是吗?
  • 事情就是这样,使用 return 只会返回到调用函数的上下文。如果你真的想要退出语义来停止执行,你可以这样做:vikku.info/codesnippets/javascript/…
  • @Ken - 您提供的链接处理停止执行 for 循环。即使那样,我也不知道为什么要使用建议的方法,而您可以直接致电break;。要使用文章中的示例:if(i==5) break; 使用 return 将停止函数的执行,无论您是否处于 for 循环中。
  • Syom - 是的,return 将停止函数的执行,这似乎是您所要求的。

标签: javascript


【解决方案1】:

我认为抛出一个新错误是停止执行的好方法,而不是仅仅返回或返回 false。例如。我正在验证一些文件,我只允许在单独的函数中上传最多五个文件。

validateMaxNumber: function(length) {
   if (5 >= length) {
        // Continue execution
   }
   // Flash error message and stop execution
   // Can't stop execution by return or return false statement; 
   let message = "No more than " + this.maxNumber + " File is allowed";
   throw new Error(message);
}

但是我从主流函数调用这个函数

  handleFilesUpload() {
      let files =  document.getElementById("myFile").files;
      this.validateMaxNumber(files.length);
}

在上面的示例中,除非我抛出新的错误,否则我无法停止执行。仅当您在执行的主函数中时才返回或返回 false 才有效,否则它不起作用。

【讨论】:

  • 但是我抛出错误后函数一直在执行。
  • No throw new Error() 在确实出现问题时使用。如果你想退出函数使用return true/false。大型应用程序正在保存错误,如果它会从正确的工作代码中记录数千个错误,那将是可悲的。
【解决方案2】:
function myfunction() {
     if(a == 'stop') 
         return false;
}

return false; 比 return; 要好得多

【讨论】:

  • 为什么false 更好?我想说默认的undefined 在一般情况下更好。无论哪种方式,您都说返回有意义的值通常更好。
  • 这取决于程序员并取决于用例。例如,一个函数可能会验证某些内容,因此如果验证失败,返回false 比返回undefined 更有意义。
【解决方案3】:

我不喜欢回答不是真正解决方案的问题...

...但是当我遇到同样的问题时,我做了以下解决方法:

function doThis() {
  var err=0
  if (cond1) { alert('ret1'); err=1; }
  if (cond2) { alert('ret2'); err=1; }
  if (cond3) { alert('ret3'); err=1; }
  if (err < 1) {
    // do the rest (or have it skipped)
  }
}

希望它对任何人都有用。

【讨论】:

  • 呃。这么简单我从来没想过!!避免大的嵌套 IF 非常有用。谢谢。
  • 如果有开关会更好。
  • 取决于您是否希望一次获得所有错误警报,或者只收到一个通知。但是,无论如何都需要执行每个条件。
【解决方案4】:

键入任何引发错误的随机命令,例如:

exit

或

die:-)

【讨论】:

  • 这可能会停止执行所有代码,而不仅仅是函数的其余部分。检查小提琴:jsfiddle.net/b3k0xo7n/1
  • 多么糟糕的编程方法。对于使用相同代码库的其他开发人员来说,这有多直观?
【解决方案5】:

退出();可用于进行下一次验证。

【讨论】:

    【解决方案6】:

    使用return 将停止函数并返回undefined,或者您使用return 命令指定的值。

    function myfunction(){
        if(a=="stop"){
            //return undefined;
            return; /** Or return "Hello" or any other value */
        }
    }
    

    【讨论】:

      【解决方案7】:

      使用稍微不同的方法,您可以使用try catch,带有 throw 语句。

      function name() {
          try {
              ...
      
              //get out of here
              if (a == 'stop')
                  throw "exit";
      
              ...
          } catch (e) {
              // TODO: handle exception
          }
      }
      

      【讨论】:

      • 这可能是真正停止执行的唯一方法。但是,我确实认为原始海报是在谈论尽早从功能中返回。 (有人为此制作了一个 1 分钟的 youtube 视频,我刚刚找到,哈哈 break out。毕竟,您可以在技术上决定根据外部范围内的返回值抛出异常。(在我看来这会更合适逻辑上。)
      【解决方案8】:

      显然你可以这样做:

      function myFunction() {myFunction:{
          console.log('i get executed');
          break myFunction;
          console.log('i do not get executed');
      }}
      

      通过使用标签查看块范围:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label

      我还没有看到任何缺点。但它似乎并不常见。

      得出这个答案:JavaScript equivalent of PHP’s die

      【讨论】:

      • 是否可以将此解决方案与 nodejs 导出模块一起使用?当我尝试它时,我得到“未使用的标签”错误。 exports.MyFunction = function(data){myFunction:{break myFunction;}}
      【解决方案9】:

      如果您使用的是 jquery。这应该会阻止函数冒泡,因此调用它的父函数也应该停止。

        function myfunction(e)
        {
             e.stopImmediatePropagation();
             ................
        }
      

      【讨论】:

      • stopImmediatePropagation() 不是 jQuery 的东西,停止传播与退出函数不是一回事。
      【解决方案10】:

      如果你正在寻找一个脚本来避免在发现一些错误时提交表单,这个方法应该可以工作

      function verifyData(){
           if (document.MyForm.FormInput.value.length == "") {
                alert("Write something!");
           }
           else {
                document.MyForm.submit();
           }
      }
      

      将提交按钮类型更改为“按钮”

      <input value="Save" type="button" onClick="verifyData()">
      

      希望对您有所帮助。

      【讨论】:

        【解决方案11】:

        你可以使用return。

        function myfunction() {
             if(a == 'stop') 
                 return;
        }
        

        这会将undefined 的返回值发送给任何调用函数的对象。

        var x = myfunction();
        
        console.log( x );  // console shows undefined
        

        当然,您可以指定不同的返回值。无论返回什么值,都将使用上面的示例记录到控制台。

        return false;
        return true;
        return "some string";
        return 12345;
        

        【讨论】:

        • 我知道这是一篇旧帖子,这是常见的做法,但我认为这是一个糟糕的解决方案。如果该函数应该返回一个值,则应使用 return。如果你只是盲目地使用 return,你以后可能会遇到问题。尤其是当您开始绑定具有返回值的事件时。查看这篇文章了解更多信息:fuelyourcoding.com/jquery-events-stop-misusing-return-false
        • @dbme:JavaScript 中的函数总是返回。如果未提供 return 语句,则它是隐式的。默认返回值为undefined,这就是我的主要解决方案所提供的。您引用的文章正在谈论在 jQuery 事件处理程序中执行 return false。那是一个完全不同的问题。这是退出 JavaScript 函数的正确方法。显然,如果调用者依赖于返回的值,则需要适当地定义该值。
        • ...隐式变体将是 if(a != 'stop') { /* run my code */ },因此代码仅在 a 不等于 'stop' 时运行,而不提供显式 return。但返回值与我的解决方案相同。在这两种情况下,undefined 都会被返回。
        • 很棒的反应。我没有意识到返回 undefined 与 false 与不同的值之间有什么区别。在过去的一个小时里,我一直试图找到关于这种行为的明确答案。所以可以安全地说(重申你的观点)return 是退出方法的 100% 安全方式,即使调用者绑定到事件等?
        • @dbme:嗯,这完全取决于调用函数的方法所期望的内容。如果某个代码库定义了一个事件系统,如果它接收到undefined(或者它没有接收到其他值)作为返回值,那么你需要遵守该 API 的规范,并返回正确的值。通常对于事件处理系统,它会期望undefined 作为处理程序已完成的简单指示,并且没有进一步的指令。在 jQuery 中,return false; 具有特殊含义,可以指示执行 preventDefault 和 stopPropagation。
        【解决方案12】:

        这个:

        function myfunction()
        {
             if (a == 'stop')  // How can I stop working of function here?
             {
                 return;
             }
        }
        

        【讨论】:

          猜你喜欢
          • 2021-01-11
          • 1970-01-01
          • 2012-11-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-13
          • 1970-01-01
          • 2021-11-04
          相关资源
          最近更新 更多