提前退出功能?


402

我有一个功能:

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

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


4
您要停止执行还是返回?
Ken Struys 2010年

@Ken Struys有什么区别?据我了解,如果我退货,它会停止执行吗?是不是
西蒙

3
好了,使用return只会返回到调用函数的上下文。如果你真的想退出语义要停止执行,你可以做这样的事情 vikku.info/codesnippets/javascript/...
肯Struys

1
@Ken-您提供的链接用于停止执行for循环。即使那样,我也不知道为什么在您可以调用时使用建议的方法break;。要使用本文中的示例:无论您是否处于循环中,if(i==5) break;using return都将停止函数的执行for
user113716 2010年

Syom-是的,return将停止执行该功能,这似乎是您所要求的。
user113716 2010年

Answers:


639

您可以使用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;

4
我知道这是一个过时的帖子,这是常见的做法,但是我认为这是一个不好的解决方案。如果该函数应返回值,则应使用return。如果您只是盲目使用return,那么以后可能会遇到问题。尤其是当您开始绑定有回报的事件时。看看这个帖子以了解更多信息:fuelyourcoding.com/jquery-events-stop-misusing-return-false

64
@dbme:JavaScript中的函数总是返回。如果未提供return语句,则它是隐式的。默认返回值为undefined,这就是我的主要解决方案所提供的。您引用的文章是关于return false在jQuery事件处理程序中执行操作的。那是完全不同的问题。这是退出JavaScript函数的正确方法。显然,如果调用方依赖返回的值,则需要适当定义该值。
user113716 2011年

3
...一个隐式变体是if(a != 'stop') { /* run my code */ }这样,该代码仅在a不相等的'stop'情况下才运行,而不提供显式return。但是返回值与我的解决方案相同。在两种情况下,undefined都将被退回。
user113716 2011年

3
很棒的回应。我不知道返回undefined vs false与返回另一个值之间没有任何区别。在过去的一个小时中,我一直在努力寻求有关此行为的明确答案。因此,可以肯定地说(重申您的观点)即使调用者绑定了事件等,返回还是100%安全的退出方法的方法?

@dbme:好吧,这完全取决于调用函数的方法所期望的内容。如果某个代码库定义了一个事件系统,该事件系统在接收undefined(或未接收到其他值)作为返回值时会中断,那么您将需要符合该API的规范,并返回正确的值。通常,对于事件处理系统,它将undefined作为处理程序已完成的简单指示,并且没有进一步的说明。使用jQuery,return false;给a preventDefault和做指令具有特殊含义stopPropagation
user113716 2011年

49

显然,您可以这样做:

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等同于PHP的消亡


是否可以将此解决方案与nodejs导出模块一起使用?尝试时,出现“未使用的标签”错误。Exports.MyFunction =函数(数据){myFunction:{break myFunction;}}
Yuri Almeida

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

return false; 比仅仅好多了 return;


13
为什么false更好?我想说undefined在一般情况下默认值更好。无论哪种方式,您都正确地说,返回有意义的值通常会更好。
Brad Koch

这取决于程序员,并取决于用例。例如,一个函数可能会验证某些内容,因此,如果验证失败,则返回false比有意义undefined
亚当·麦克阿瑟

18

这个:

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

11

使用一些不同的方法,可以将try catch,和throw语句一起使用。

function name() {
    try {
        ...

        //get out of here
        if (a == 'stop')
            throw "exit";

        ...
    } catch (e) {
        // TODO: handle exception
    }
}

3

如果您正在寻找避免在发现某些错误时提交表单的脚本,则此方法应该有效

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

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

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

希望有帮助。


2

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

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

1

我不喜欢回答不是真正的解决方案的事情...

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

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非常有用。谢谢。
黛比A

使用开关会更好。
bdelmas

取决于您是否希望一次收到所有错误警报,而仅收到一次警报。但是,无论如何都需要执行每个条件。
狮子座

0

我认为引发新错误是停止执行的好方法,而不仅仅是返回或返回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);
}

在上面的示例中,除非抛出新的Error,否则我无法停止执行。只有在执行的主要功能中,仅return或return false才起作用。



-4

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

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

6
stopImmediatePropagation()不是jQuery,停止传播与退出函数不一样。
Brad Koch

-13

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

exit

要么

die:-)

这可能会阻止所有代码执行,而不仅仅是功能的其余部分。检查小提琴:jsfiddle.net/b3k0xo7n/1
treecon

1
多么糟糕的编程方法。对于在同一代码库上工作的另一个开发人员来说,这怎么直观?
osullic '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.