¿La función Javascript no puede devolver el objeto cuando hay un salto de línea entre la declaración de devolución y el objeto?
Aquí está el jsfiddle
El código completo:
function foo1(){
return {msg: "hello1"};
}
function foo2(){
return
{msg: "hello2"};
}
// output = "foo1 = {"msg":"hello1"}"
console.log('foo1 = ' , JSON.stringify(foo1()));
//output = " foo2 = undefined "
console.log('foo2 = ' , JSON.stringify(foo2()));
La diferencia entre los dos es que en foo2, {msg: 'hello'}
está en su propia línea nueva. ¿Esperaba que el analizador ignorara los espacios en blanco?
tl;dr El salto de línea está provocando el 'indefinido' en la segunda función. JavaScript no requiere punto y coma en muchos casos y simplemente los asume en ciertos contextos ( Inserción automática de punto y coma ).
En determinados casos, para evitar este problema ASI y por motivos estéticos, utilizo el llamado operador de agrupación . Por ejemplo, con hoquet que crea plantillas DSL (compila Arrays como expresiones s en HTML), me gusta agrupar los Arrays para que muestren claramente la estructura HTML:
return (
["ul"
, ["li"
, ["span", {class: "name"}, this.name]
, ["span", {id: "x"}, "x"]
]
]
);
lo cual me parece algo más claro o más consistente que
return [
"ul",
[
"li",
["span", {class: "name"}, this.name],
["span", {id: "x"}, "x"]
]
];
y terminan con el mismo número de líneas. Pero en realidad es una cuestión de estética.
El operador de agrupación simplemente evalúa cualquier expresión que contenga. Esto se ve comúnmente con Expresiones de funciones invocadas inmediatamente , donde es necesario convertir lo que normalmente sería una declaración de función en una expresión , que luego se puede invocar inmediatamente (de ahí el nombre). Sin embargo, una característica quizás menos conocida del operador de agrupación es que también puede tomar una lista de expresiones delimitadas por comas, por ejemplo
function() {
return (
doSideEffects(),
console.log("this is the second side effect"),
1 + 1
);
}
En este caso evalúa cada una de estas expresiones y devuelve sólo la última (1 + 1).
La respuesta aceptada parece ser correcta.
Sin embargo, encontré esta variante de una línea de retorno con salto de línea en un corchete de apertura de argumento de función SÍ funciona:
myFunction(){
return myOtherFucntion(
myArg);
}
Y esta otra variante con salto de línea antes de '.' El operador de punto TAMBIÉN funciona:
myFunction(){
return myObject
.myObjectFunction();
}
(El estilo/legibilidad de mis ejemplos es obviamente un poco extraño, pero trate de prestar atención a las conclusiones a las que llegan y ejerza su propio estilo según lo considere apropiado).