¿Qué diferencia hay en analizar algo como un objeto literal en lugar de como un bloque?

Lo siento por mi ignorancia en los conceptos básicos de JavaScript.

Todo se reduce a esto:

Literal: un valor que se encuentra directamente en el script. Ejemplos:

3.14 "This is a string" [2, 4, 6] 

Expresión: un grupo de tokens, a menudo literales o identificadores, combinados con operadores que pueden evaluarse a un valor específico. Ejemplos:

 2.0 "This is a string" (x + 2) * 4 

Hay una diferencia muy clara entre los dos anteriores en Javascript.

Por casualidad he leído este artículo . Y estoy familiarizado con la diferencia b / w function declaration y function expression y cuándo usar una sobre otra o viceversa.

Del mismo artículo:

…. También puede recordar que cuando evalúa JSON con eval, la cadena generalmente se envuelve entre paréntesis: eval (‘(‘ + json + ‘)’). Por supuesto, esto se hace por la misma razón: el operador de agrupación, que son paréntesis, obliga a los corchetes JSON a ser analizados como expresión en lugar de como un bloque:

 try { { "x": 5 }; // "{" and "}" are parsed as a block } catch(err) { // SyntaxError } ({ "x": 5 }); // grouping operator forces "{" and "}" to be parsed as object literal 

Entonces, ¿qué diferencia hay en analizar algo como un object literal no sea analizarlo como un block ?

¿Y con qué propósito debo considerar hacer uso del grouping character de grouping character , en el contexto del parsing ?

Primero, no eval JSON , use JSON.parse en la fuente String


Un bloque es un “grupo de expresiones” por ejemplo,

 let x = 0; if (true) { // this is a block ++x; } 

Sin embargo, igualmente esto es también un bloque.

 let x = 0; { // hi there, I'm a block! ++x; } 

Esto significa que cuando el intérprete ve la notación de bloque, asume un locking incluso si hace algo como esto

 { // this is treated as a block foo: ++x } 

Aquí, foo actúa como una etiqueta en lugar de un nombre de propiedad y si intenta hacer cosas más complejas con el bash de objeto literal, obtendrá un Error de syntax .

Cuando desea escribir un objeto literalmente ambiguamente como este, la solución es forzar al intérprete a “modo de expresión” explícitamente proporcionando paréntesis

 ({ // this is definately an Object literal foo: ++x }) 

Un grupo que comienza con { y termina con } se trata como un objeto literal o como un bloque según el contexto *.

Dentro de un contexto de expresión, el grupo se interpreta como un objeto literal. Escribir un bloque dentro de un contexto de expresión generará un error de syntax:

 // Valid code: foo = {a:b}; ({a:b}); // Syntax errors: foo = {var a = b}; ({var a = b}); 

Fuera de un contexto de expresión, el grupo se interpreta como un bloque. Dependiendo de cómo se escribe exactamente el código, un objeto literal escrito fuera de un contexto de expresión es un error de syntax o se interpretará como una etiqueta.

* nota: En la especificación ECMAscript, la palabra “contexto” se usa para significar algo específico. Mi uso de la palabra aquí es con el significado general en ciencias de la computación con respecto al análisis.