eval
toma una declaración o expresión de JavaScript, pero {...}
sería válida como una declaración o una expresión, y la gramática de JavaScript prefiere una declaración.
Como expresión:
{"10000048":"1","25000175":"2","25000268":"3"}
es un objeto con algunas propiedades (lo que quiere).
Como una declaración, que es un bloque:
{ // begin Block
"10000048": // LabelledStatement (but the quotes are invalid)
"1", // Expression, calculate string "1" then discard it, then
"25000175": // you can't put a label inside an expression
que da un error.
(etiquetas de JavaScript se pueden utilizar para etiquetar una declaración particular para su uso con break
/continue
. Son un poco inútil y casi nunca se utiliza.)
Así que mediante la adición de los paréntesis a resolver la ambigüedad. Solo una expresión puede comenzar con (
, por lo que los contenidos se analizan en un contexto de expresión, dando un objeto literal, no un contexto de declaración.
Por cierto, esto no es bastante suficiente para interpretar correctamente todos los valores JSON posibles. Debido a un descuido en el diseño de JSON, los caracteres U + 2028 y U + 2029, dos caracteres oscuros que terminan de línea Unicode, son válidos para colocarlos en un literal de cadena JSON, pero no en un literal de cadena de JavaScript.Si desea estar seguro, puede escapar de ellos, por ejemplo:
function parseJSON(s) {
if ('JSON' in window) return JSON.parse(s);
return eval('('+s.replace(/\u2028/g, '\\u2028').replace(/\u2029/g, '\\u2029')+')');
}
¿Por qué está utilizando 'eval' en primer lugar? Simplemente quédese con: 'var strJson = $ (" # estado "). Val(). Replace ("; "," ");' –