2010-09-15 8 views
31

Estoy refactorizando un gran documento de JavaScript que recogí de un proyecto de código abierto. Varias funciones usan declaraciones de retorno inconsistentes. Aquí está un ejemplo sencillo de lo que quiero decir:¿Hay algún beneficio al usar una declaración de devolución que no devuelve nada?

var func = function(param) { 
    if (!param) { 
     return; 
    } 
    // do stuff 
    return true; 
} 

A veces las funciones devuelven booleano, a veces cuerdas u otras cosas. Por lo general, se combinan de forma incoherente con una simple declaración return; dentro de un condicional.

El problema es que el código es complejo. Es un analizador que usa una multitud de coincidencias RegEx únicas, crea y destruye nodos DOM sobre la marcha, etc. Las pruebas preliminares muestran que, en el ejemplo anterior, pude cambiar la declaración return; para convertirme en return false;, pero me preocupa que Puede que no me dé cuenta de que tuvo un impacto negativo (es decir, que una característica dejó de funcionar) en el script hasta mucho más tarde.

Así que mis preguntas: ¿Existe un beneficio de usar una instrucción de retorno en blanco? ¿Pudo haber sido intencionalmente codificado de esta manera o simplemente era flojo? ¿Puedo cambiarlos todos a return false; o return null; o necesito buscar en cada llamada y averiguar qué están haciendo con los resultados de esas funciones?

+0

Me parece que me detengo a pensar menos durante los ciclos de mantenimiento si devuelvo la explicidad de los logotipos verdaderos o falsos, pero como otros señalan garantizar el uso funcional antes de los cambios globales. –

Respuesta

35

El uso de return sin un valor devolverá el valor undefined.

Si el valor se evalúa como un valor lógico, undefined funcionará como false, pero si el valor por ejemplo se compara con false, recibirá un comportamiento diferente:

var x; // x is undefined 
alert(x); // shows "undefined" 
alert(!x); // shows "true" 
alert(x==false); // shows "false" 

Así, mientras que el código debe lógicamente devolver true o false, no true o undefined, no puede simplemente cambiar return; a return false; sin verificar cómo se utiliza el valor de retorno.

+0

No consideré indefinido. Como usted es el primero en mencionarlo, y su respuesta es similar a las demás, estoy marcando esto como correcto. – Stephen

+0

@Stephen Tenga en cuenta que esto no significa que pueda cambiarlo a 'return undefined;', ya que eso significará devolver la variable global indefinida, que hasta los navegadores más recientes podrían ser cualquier cosa. – Paulpro

+0

@ user1: Soy consciente de que la '' constante '' indefinida '' no es realmente constantes (incluso publiqué sobre eso), ¿pero no sabía que esto cambiaría? ¿Ha cambiado la especificación EcmaScript? – Guffa

14

Las declaraciones de "retorno en blanco" pueden utilizarse para transferir el control a la función de llamada (o detener la ejecución de una función por alguna razón, por ejemplo, validaciones, etc.). En la mayoría de los casos que uso declaración de devolución en blanco es cuando estoy haciendo algún tipo de validación. Sin embargo, procuro establecer un indicador de por qué se detiene la ejecución de la función. Por ejemplo, establezca la propiedad "innerText" en un elemento DIV con el mensaje de error.

En el código anterior, parece que se trata de una validación. La función devuelve un "verdadero" si todo salió bien. Parece que la función de llamada analiza el valor de retorno, y si es "verdadero", se ejecuta el siguiente paso de enunciados (en la función de llamada).

Es una buena práctica devolver "falso" en lugar de un retorno en blanco en el ejemplo anterior. De esa manera, haces que todo sea uniforme y facilite la vida a otros programadores.

Podría corregir estas incoherencias; Sin embargo, asegúrese de probar todos los cambios a fondo. Es una buena práctica probar cada cambio que realice en el código, por pequeño que sea.

5

Al cambiar las funciones, se modificará el código porque return; y return false; muestran diferentes tipos de datos.

var test = function (x) { 
    if (!x) { 
     return; 
    } 
    else { 
     return false; 
    } 
}; 

var a = test(true), b = test(false); 

console.log(typeof b); // boolean 
console.log(typeof a); // undefined 
+0

Muy bien. ¡Gracias! – Stephen

8

lo que podría perderse aquí (no directa con su ejemplo) es que a continuación, puede tener un objeto de tres estados:

var myfunc = function(testparam) { 
    if (typeof testparam === 'undefined') return; 
    if (testparam) { 
     return true; 
    } 
    else { 
     return false; 
    } 
}; 

var thefirst = myfunc(true) 
var thesecond = myfunc(false); 
var thelast = myfunc(); 
alert("type:" + typeof thefirst+" value:"+thefirst); 
alert("type:" + typeof thesecond+" value:"+thesecond); 
alert("type:" + typeof thelast+" value:"+thelast); 

éstos retorno:

> type:boolean:true 
> type:boolean:false 
> type:undefined:undefined 

nota: null devolvería falso en este ejemplo myfunc (null);

+0

Gracias por la explicación. – Stephen

+0

Esta respuesta tiene 6 años y nadie ha hecho la siguiente observación, por lo que tal vez no entiendo correctamente la explicación de "nota". Habiendo dicho eso, myfunc (null) volvería falso, no indefinido. – bryonbean

+0

@bryonbean esta línea en la parte superior: 'if (typeof testparam === 'undefined') return;' esto fue editado de 'if (testparam === undefined) return;' sin embargo, el principio sigue siendo verdadero –

Cuestiones relacionadas