¿Salida anticipada de la función?


402

Tengo una funcion:

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

¿Hay algo como exit()en JavaScript?


44
¿Quieres detener la ejecución o volver?
Ken Struys

@ Ken Struys, ¿cuál es la diferencia? según tengo entendido, si hago una devolución, ¿detiene la ejecución? no es asi
Simon

3
Bueno, aquí está la cosa, el uso de un retorno solo volverá al contexto de la función de llamada. Si realmente desea la salida semántica que desea detener la ejecución, puede hacer algo como esto: vikku.info/codesnippets/javascript/…
Ken Struys

1
@Ken: ese enlace que proporcionó se ocupa de detener la ejecución de un forbucle. Incluso entonces, no tengo idea de por qué se usaría el método sugerido, cuando simplemente podría llamar break;. Para usar el ejemplo del artículo: El if(i==5) break;uso returndetendrá la ejecución de la función, esté o no en un forbucle.
user113716

Syom: Sí, returndetendrá la ejecución de la función, que parece ser lo que solicitó.
user113716

Respuestas:


639

Solo puedes usar return.

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

Esto enviará un valor de retorno de undefinedlo que se llama la función.

var x = myfunction();

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

Por supuesto, puede especificar un valor de retorno diferente. Cualquier valor devuelto se registrará en la consola utilizando el ejemplo anterior.

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

44
Sé que esta es una publicación antigua, y esta es una práctica común, PERO creo que esta es una mala solución. Si se supone que la función devuelve un valor, debe usar return. Si solo usa ciegamente return, podría tener problemas más tarde. Especialmente si comienzas eventos vinculantes que tienen un retorno en ellos. Consulte esta publicación para obtener más información: fuelyourcoding.com/jquery-events-stop-misusing-return-false

64
@dbme: las funciones en JavaScript siempre regresan. La declaración de devolución está implícita si no se ha proporcionado. El valor de retorno predeterminado es undefined, y eso es lo que proporciona mi solución principal. El artículo al que hizo referencia se refiere a hacer return falseen un controlador de eventos jQuery. Esa es una cuestión completamente diferente. Esta es la forma correcta de salir de una función de JavaScript. Obviamente, si la persona que llama depende del valor devuelto, el valor debe definirse adecuadamente.
user113716

3
... Una variación implícita sería if(a != 'stop') { /* run my code */ }para que el código solo se ejecute cuando ano sea igual 'stop'sin proporcionar un explícito return. Pero el valor de retorno es idéntico a mi solución . En ambos casos, undefinedserá devuelto.
user113716

3
Impresionante respuesta. No me di cuenta de que había alguna diferencia entre devolver indefinido versus falso versus un valor diferente. He estado tratando de encontrar una respuesta definitiva con respecto a este comportamiento durante la última hora. Entonces, ¿es seguro decir (para reiterar su punto) que el retorno es una forma 100% segura de salir de un método, incluso si la persona que llama está vinculada a eventos, etc.?

@dbme: Bueno, todo depende de lo que se espera del método que llama a la función. Si alguna biblioteca de códigos define un sistema de eventos que se romperá si recibe undefined(o no recibe algún otro valor) como un valor de retorno, entonces deberá cumplir con la especificación de esa API y devolver el valor correcto. En general, para un sistema de manejo de eventos, esperará undefinedcomo una simple indicación de que el controlador ha finalizado, y no hay más instrucciones. Con jQuery, return false;tiene un significado especial dando instrucciones para hacer un preventDefaulty stopPropagation.
user113716

49

Aparentemente puedes hacer esto:

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

Vea los ámbitos de bloque mediante el uso de una etiqueta: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label

No puedo ver ninguna desventaja todavía. Pero no parece un uso común.

Derivó esta respuesta: JavaScript equivalente del dado de PHP


¿Es posible utilizar esta solución con el módulo de exportaciones de nodejs? cuando lo intento aparece el error "etiqueta no utilizada". export.MyFunction = function (data) {myFunction: {break myFunction;}}
Yuri Almeida

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

return false; es mucho mejor que solo return;


13
¿Por qué es falsemejor? Yo diría que el valor predeterminado undefinedes mejor en el caso genérico. De cualquier manera, tiene razón al decir que a menudo es mejor devolver un valor significativo.
Brad Koch

Depende del programador y depende del caso de uso. Por ejemplo, una función puede validar algo, por lo que si la validación falla, tiene más sentido regresar falseque undefined.
Adam McArthur

18

Esta:

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

11

Usando un enfoque un poco diferente, puede usar try catch, con la declaración throw.

function name() {
    try {
        ...

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

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

3

Si está buscando un script para evitar enviar el formulario cuando se encuentran algunos errores, este método debería funcionar

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

cambie el tipo de botón Enviar a "botón"

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

espero que esto ayude.


2

Usar a returndetendrá la función y devolverá undefined, o el valor que especifique con el comando return.

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

1

No me gusta responder cosas que no son una solución real ...

... pero cuando encontré este mismo problema, hice la siguiente solución:

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 pueda ser útil para cualquiera.


Duh ¡Eso es tan simple que nunca lo pensé! Muy útil para evitar grandes IF anidados. Gracias.
Debbie A

Esto sería mejor con un interruptor.
bdelmas

Depende de si desea recibir todas las alertas de error a la vez, de recibir una notificación. Sin embargo, cada condición debe ejecutarse de todos modos.
Leo

0

Creo que lanzar un nuevo error es un buen enfoque para detener la ejecución en lugar de simplemente devolver o devolver falso. Por ej. Estoy validando una cantidad de archivos que solo permito un máximo de cinco archivos para cargar en una función 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);
}

Pero estoy llamando a esta función desde la función de flujo principal como

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

En el ejemplo anterior, no puedo detener la ejecución a menos que arroje un nuevo error. Solo devolver o devolver falso solo funciona si está en la función principal de ejecución; de lo contrario, no funciona.



-4

Si está utilizando jquery. Esto debería evitar que la función brote hasta que la función principal que llama a esto también se detenga.

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

66
stopImmediatePropagation()no es una cosa de jQuery, y detener la propagación no es lo mismo que salir de una función.
Brad Koch el

-13

escriba cualquier comando aleatorio que arroje un error, por ejemplo:

exit

o

die:-)

Esto puede detener la ejecución de todo el código, no solo el resto de la función. Compruebe el violín: jsfiddle.net/b3k0xo7n/1
treecon

1
Qué terrible enfoque de programación. ¿Cómo es esto intuitivo para otro desarrollador que trabaja en la misma base de código?
osullic
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.