javascript - usar - ¿Por qué los resultados varían en función de la colocación del corsé?
resultados de usar corset (7)
He leído este article , donde se muestra un ejemplo. Explique por qué los fragmentos de código a continuación arrojan resultados diferentes debido a cambios en la colocación de las llaves.
Ejemplo con una llave de apertura {
en la nueva línea.
function test()
{
return
{ /* <----curly brace in new line */
javascript: "fantastic"
};
}
var r = test();
try {
alert(r.javascript); // does this work...?
} catch (e) {
alert(''no - it broke: '' + typeof r);
}
test()
devuelve undefined
.
Ejemplo con una llave de apertura {
en la misma línea que la return
.
function test()
{
return { /* <----inline curly brace */
javascript : "fantastic"
};
}
var r = test();
try {
alert(r.javascript); // does this work...?
} catch (e) {
alert(''no - it broke: '' + typeof r);
}
test()
devuelve un objeto.
Aquí está el ejemplo en vivo, cuidado con las llaves .
El problema es, de hecho, la inyección de punto y coma como se describió anteriormente. Acabo de leer una buena publicación en el blog sobre este tema. Explica este problema y mucho más sobre javascript. También contiene algunas buenas referencias. Puedes leerlo here
Es porque javascript pone con frecuencia ";" al final de cada línea, tan básicamente cuando tienes devolución {en la misma línea, el motor de JavaScript ve que habrá algo más, y cuando está en una nueva línea cree que olvidaste poner ";" y se lo pone por ti.
Esa es una de las trampas de javascript: inserción automática de punto y coma. Las líneas que no terminan con un punto y coma, pero que podrían ser el final de una declaración, se terminan automáticamente, por lo que su primer ejemplo se ve así:
function test()
{
return; // <- notice the inserted semicolon
{
javascript : "fantastic"
};
}
Ver también http://javascript.crockford.com/code.html
En el segundo ejemplo, devuelve un objeto (construido con las llaves) con la propiedad javascript y su valor fantástico, efectivamente el mismo que este:
function test() {
var myObject = new Object();
myObject.javascript = "fantastic";
return myObject;
}
Excluyendo el return;
estándar return;
razón.
Los corchetes en las nuevas líneas son MALOS HABITOS tomados de otros laguanges tipo C donde este es un estándar. Si la legibilidad es la razón, entonces también podemos proporcionar esto mediante un nombre de variable escrito en su propia etiqueta, pero no lo estamos haciendo, ¿verdad? Los nuevos corchetes de línea SON MALOS HABITOS , y también, por ejemplo en google chrome, se muestran como errores de debugger.
Cuando trabajas con equipos, hay un 99% de posibilidades de que la nueva línea {
esté prohibida debido a un IDE que automáticamente estandarizará el código. Como WebStorm / VisualStudio.
Cuando mires el github, verás que el más popular es {
en la misma línea. (Si encuentra otra versión, proporcione un ejemplo)
Además, cada línea de código debe tener un significado en las guías que se interpretan principalmente como no compiladas. ¿Cómo "explicarías" para interpretar una línea que comienza con:
{
? ¿es el comienzo del bloque? Supongo que dijiste que yes
. Ahora dime cuánto puedes decir sobre:
function foo() {
(por supuesto, estamos hablando de archivos no miniados para los cuales también estamos guardando algunos b de memoria)
No me gusta obligar a inteprer a mirar hacia adelante / atrás. Debe leer la línea y hacer algo que esté en línea, no en dos líneas.
Estoy seguro de que ECMA 202X lo agregará como ESTÁNDAR. Realmente no me importa si alguien lo está haciendo en sus proyectos, pero como persona que trabaja principalmente con EQUIPOS de programadores, no aceptaría este tipo de código.
El siguiente caso sería agregar cómo CoffeScript / TypeScript y otros dialectos. Estas herramientas le devolverán el código con {
con la misma línea. ¿Por qué? Porque es así como debería hacerse.
EDITAR:
Profundicé con mi investigación al respecto, y me puse en contacto con el equipo ECMA mismo
Hola, estoy bastante seguro de que probablemente no responda sobre eso. Pero me gustaría saber qué prefiere el equipo de ECMA. ¿Que los corchetes en javascript estarían escritos en la misma línea o en una nueva línea? (excluyendo el ejemplo con la declaración "return" y la inserción automática del punto y coma. Estoy escribiendo mi tesis, y su mensaje sería tan útil como un punto de vista profesional. Gracias por su excelente trabajo.
como Answere entiendo esto:
TC39 no toma ninguna posición oficial de problemas de estilista como este. Estoy seguro de que entre los delegados miembros que participan en TC39 encontrará varias opciones sobre el formato del código. Sin embargo, sospecho que la mayoría preferiría usar puntos y comas explícitos en lugar de confiar en ASI .
editar: Sé que algunas personas se sienten frustradas por el hecho de que están haciendo algo mal, pero dar un "-1" no es el mejor enfoque. La sección de comentarios está abierta, así que comparta su opinión con otros.
Javascript no requiere punto y coma al final de las instrucciones, pero el inconveniente es que tiene que adivinar dónde están los puntos y comas. La mayoría de las veces esto no es un problema, pero a veces inventa un punto y coma en el que no tenía intención de hacerlo.
Un ejemplo de mi blog sobre esto ( Javascript - casi no basado en línea ):
Si formatea el código de esta manera:
function getAnswer() {
var answer = 42;
return
answer;
}
Entonces se interpreta así:
function getAnswer() {
var answer = 42;
return;
answer;
}
La declaración de retorno toma su forma sin parámetros, y el argumento se convierte en una declaración propia.
Lo mismo le ocurre a su código. La función se interpreta como:
function test()
{
return;
{
javascript : "fantastic"
};
}
Las llaves aquí indican la construcción de un nuevo objeto. Por lo tanto, su código es equivalente a:
function test() {
var a = { javascript : "fantastic" };
return a;
}
que funciona mientras que si escribes:
function test() {
var a = { javascript : "fantastic" };
return; // ; is automatically inserted
a;
}
ya no funciona.
Yo personalmente prefiero el estilo Allman para la legibilidad (vs estilo K & R).
En lugar de…
function test() {
return {
javascript : "fantastic"
};
}
Me gusta…
function test()
{
var obj =
{
javascript : "fantastic"
};
return obj;
}
Pero esto es una solución. Sin embargo, puedo vivir con eso.