La ambigüedad de sintaxis a la que se refiere Crockford es que si una llave de apertura no se encuentra en la expresión contexto, se reconocerá como un block, y no como el inicio de un objeto literal.
Por ejemplo:
{"foo": "bar"} // SyntaxError
le dará un error de sintaxis, porque va a ser interpretado como un bloque, con una cadena literal "foo", y un uso inesperado de la ficha :
.
Por otro lado, los paréntesis, formalmente llamados the grouping operator, sólo se puede evaluar expresiones, por lo tanto, no vamos a tener ninguna ambigüedad sintaxis, porque un bloque sólo se puede esperar en un contextocomunicado.
({"foo": "bar"})
Editar:@el.pescado hace una pregunta interesante:
Puede explicar por qué eval ('{}') es indefinido?
ECMAScript describe un tipo interno para explicar el comportamiento de los estados, se llama The Completion Specification Type.
valores del tipo de finalización son triples de la forma de (type, value, target)
, donde type
puede ser normal
, break
, continue
, return
, o throw
.
value
puede ser cualquier valor de idioma o empty
y target
cualquier identificador o empty
.
un bloque vacío (la producción Block : {}
) devuelve explícitamente la siguiente conclusión:
Return (normal, empty, empty).
La función eval
, después de ejecutar el código, y que sale del contexto de ejecución recién creado, comprueba la finalización resultado del código evaluado , y en el paso 7, podemos ver que se devuelve de forma explícita undefined
si el tipo de terminación es normal
y el valor de realización es empty
:
...
7- Si result.type es normal y su valor de finalización está vacío, devuelve el valor indefinido.
...
Si continúa leyendo la oración después de la que ha citado, desde la página que ha vinculado, verá por qué no debe usar 'eval' para este trabajo * en absoluto * –
Esa razón de eva evaluar es algo de lo que estoy consciente, de todos modos, gracias por señalar. – nepsdotin