Saída antecipada da função?

402

Eu tenho uma função:

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

Existe algo como exit()em JavaScript?

Simon
fonte
4
você deseja interromper a execução ou retornar?
Ken Struys
@ Ken Struys, qual é a diferença? pelo que entendi, se eu fizer retorno, ele interrompe a execução? não é?
Simon
3
Bem, eis a questão: usar um retorno retornará apenas ao contexto da função de chamada. Se você realmente quer a saída semântica você quiser execução stop, você poderia fazer algo parecido com isto: vikku.info/codesnippets/javascript/...
Ken Struys
11
@ Ken - Esse link que você forneceu trata de interromper a execução de um forloop. Mesmo assim, não tenho idéia do motivo pelo qual o método sugerido seria usado, quando você poderia simplesmente chamar break;. Para usar o exemplo do artigo: O if(i==5) break;uso returninterromperá a execução da função, esteja você em forloop ou não .
user113716
Syom - Sim, returninterromperá a execução da função, que parece ser o que você pediu.
user113716

Respostas:

639

Você pode apenas usar return.

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

Isso enviará um valor de retorno undefinedpara o que for chamado de função.

var x = myfunction();

console.log( x );  // console shows undefined

Obviamente, você pode especificar um valor de retorno diferente. Qualquer valor retornado será registrado no console usando o exemplo acima.

return false;
return true;
return "some string";
return 12345;
user113716
fonte
4
Eu sei que este é um post antigo, e isso é uma prática comum, mas acho que essa é uma solução ruim. Se a função É SUPOSTA para retornar um valor, você deve usar return. Se você usar o retorno às cegas, poderá ter problemas mais tarde. Especialmente se você iniciar eventos vinculativos que tenham um retorno neles. Verifique esta publicação para obter mais informações: fuelyourcoding.com/jquery-events-stop-misusing-return-false
64
@ dbme: As funções em JavaScript sempre retornam. A declaração de retorno está implícita se não tiver sido fornecida. O valor de retorno padrão é undefinede é isso que minha solução principal fornece. O artigo que você mencionou está falando sobre como fazer return falseem um manipulador de eventos jQuery. Essa é uma questão totalmente diferente. Essa é a maneira correta de sair de uma função JavaScript. Obviamente, se o chamador confiar no valor retornado, o valor precisará ser definido adequadamente.
user113716
3
... Uma variação implícita seria if(a != 'stop') { /* run my code */ }para que o código seja executado apenas quando anão for igual 'stop'sem fornecer um explícito return. Mas o valor de retorno é idêntico à minha solução . Nos dois casos, undefinedserá devolvido.
user113716
3
Resposta impressionante. Não percebi que havia alguma diferença entre retornar um valor indefinido vs falso versus um valor diferente. Eu tenho tentado encontrar uma resposta definitiva sobre esse comportamento na última hora. Portanto, é seguro dizer (para reiterar seu argumento) que o retorno é uma maneira 100% segura de sair de um método, mesmo que o chamador esteja vinculado a eventos etc.?
@ dbme: Bem, tudo depende do que é esperado pelo método que chama a função. Se alguma biblioteca de códigos definir um sistema de eventos que será interrompido se receber undefined(ou não receber outro valor) como valor de retorno, será necessário estar em conformidade com a especificação dessa API e retornar o valor correto. Geralmente, para um sistema de manipulação de eventos, espera-se undefinedcomo uma simples indicação de que o manipulador terminou e não há mais instruções. Com o jQuery, return false;tem um significado especial, fornecendo instruções para fazer um preventDefaulte stopPropagation.
user113716
49

Aparentemente, você pode fazer isso:

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

Veja os escopos de bloco através do uso de um rótulo: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label

Ainda não vejo nenhuma desvantagem. Mas isso não parece um uso comum.

Derivada esta resposta: JavaScript equivalente ao dado do PHP

CMCDragonkai
fonte
é possível usar esta solução com o módulo de exportação nodejs? quando eu tento, recebo o erro "etiqueta não usada". exports.MyFunction = função (dados) {minhaFuncao: {ruptura minhaFuncao;}}
Yuri Almeida
20
function myfunction() {
     if(a == 'stop') 
         return false;
}

return false; é muito melhor do que apenas return;

xlaok
fonte
13
Por que é falsemelhor? Eu diria que o padrão undefinedé melhor no caso genérico. De qualquer forma, você está certo ao dizer que geralmente é melhor retornar um valor significativo.
Brad Koch
Depende do programador e depende do caso de uso. Por exemplo, uma função pode validar algo; portanto, se a validação falhar, faz mais sentido retornar do falseque undefined.
Adam McArthur
18

Este:

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

Usando uma abordagem um pouco diferente, você pode usar try catch, com a declaração throw.

function name() {
    try {
        ...

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

        ...
    } catch (e) {
        // TODO: handle exception
    }
}
Rodney Salcedo
fonte
3

se você estiver procurando por um script para evitar o envio de formulários quando forem encontrados alguns erros, esse método funcionará

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

altere o tipo de botão Enviar para "botão"

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

Espero que isso ajude.

Awal Istirdja
fonte
2

Usar a returninterromperá a função e retornará undefinedou o valor que você especificar com o comando return.

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

Não gosto de responder coisas que não são uma solução real ...

... mas quando encontrei esse mesmo problema, fiz a seguinte solução alternativa:

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

Espero que possa ser útil para qualquer pessoa.

Leo
fonte
Duh. Isso é tão simples que eu nunca pensei nisso! Bastante útil para evitar grandes IFs aninhados. Obrigado.
Debbie Um
Isso seria melhor com um interruptor.
precisa saber é
Depende se você deseja receber todos os alertas de erro de uma só vez, ou ser notificado de apenas um. No entanto, cada condição precisa ser executada de qualquer maneira.
Leo
0

Eu acho que lançar um novo erro é uma boa abordagem para interromper a execução, em vez de apenas retornar ou retornar falso. Por ex. Estou validando vários arquivos que permitem apenas cinco arquivos para upload em função separada.

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

Mas estou chamando essa função da função de fluxo principal como

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

No exemplo acima, não consigo parar a execução, a menos que eu lance um novo Error.Just return or return false, só funciona se você estiver na principal função de execução, caso contrário, não funcionará.

Bedram Tamang
fonte
-3

Saída(); pode ser usado para a próxima validação.

Chirag Dineshbhai Ponda
fonte
-4

Se você estiver usando jquery. Isso deve impedir que a função borbulhe até que a função pai que chama isso também deve parar.

  function myfunction(e)
  {
       e.stopImmediatePropagation();
       ................
  }
silvster27
fonte
6
stopImmediatePropagation()não é uma coisa do jQuery e parar a propagação não é a mesma coisa que sair de uma função.
Brad Koch
-13

digite qualquer comando aleatório que gera um erro, por exemplo:

exit

ou

die:-)
amrali
fonte
Isso pode impedir que todo o código seja executado, não apenas o restante da função. Verifique o violino: jsfiddle.net/b3k0xo7n/1
treecon
11
Que abordagem de programação terrível. Como isso é intuitivo para outro desenvolvedor que trabalha na mesma base de código?
Osullic 26/06