El otro día estaba mirando una presentación de douglas crockford en la cual, como habitualmente lo hace, no sólo describía las partes buenas del lenguaje, sino también las malas. Cosas que tal vez pasaremos a ver en futuras publicaciones; pero hay una que particularmente me llamó mucho la atención y no me podía aguantar sin compartir.

Las llaves, el return, y los puntos y comas

A veces traer las mañas y costumbres de otros lenguajes pueden jugar en contra. En este ejemplo, que cualquier desarrollador de C# podría haber escrito tranquilamente (vaya tradición en C#, medio obligada, la de arrancar con las llaves en una nueva linea), se deja esto en evidencia.

function obtenerFernet(){
    return
        ({    marca: 'censored',
            precio: 46.99
        });
}

Ahora que podemos obtener un poco de fernet, vamos a servirlo..

>>> obtenerFernet()
undefined
WTF???
obtenerFernet() nos devuelve undefined. Interesante eh!?
La explicación a todo esto es que javascript va a estar insertando por nosotros un punto y coma (;) luego del return, en el salto de línea.. Y así ignorando el resto de la función:
function obtenerFernet(){
    return;
        ({    marca: 'censored',
            precio: 46.99
        });
}
La inserción automática de puntos y comas está descripta como una de las características mas raras alguna vez vistas en un lenguaje de programación.. Y no es para menos!! Uno puede estar horas y horas tratando de encontrar el problema en ese pequeño pedazo de código!
Ahora sí, vamos a arreglar la función:
function obtenerFernet(){
    return ({
            marca: 'censored',
            precio: 46.99
        });
}

Y ya estamos. Este es uno de los “pitfalls” que tenemos que evitar como desarrolladores de javascript. Algunos ejemplos más pueden encontrarse en http://lucumr.pocoo.org/2011/2/6/automatic-semicolon-insertion/#update (Inglés) como así también existe una interesante discusión en español sobre el tema.