eval
prende una dichiarazione o un'espressione JavaScript, ma {...}
sarebbe valida come una dichiarazione o un'espressione e la grammatica di JavaScript preferisce un'istruzione.
Come espressione:
{"10000048":"1","25000175":"2","25000268":"3"}
è un oggetto con alcune proprietà (quello che volete).
Come un comunicato, si tratta di un blocco:
{ // 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
che dà un errore.
(etichette JavaScript può essere utilizzato per etichettare una dichiarazione particolare per l'uso con break
/continue
. Sono un po 'inutile e quasi mai utilizzato.)
Così aggiungendo le parentesi a risolvere l'ambiguità. Solo un'espressione può iniziare con (
, quindi i contenuti vengono analizzati in un contesto di espressione, fornendo un oggetto letterale, non un contesto di istruzione.
Incidentalmente questo non è abbastanza abbastanza per interpretare correttamente tutti i possibili valori JSON. A causa di una svista nel design di JSON, i caratteri U + 2028 e U + 2029, due oscuri caratteri di fine riga Unicode, sono validi per mettere senza caratteri in una stringa JSON letterale, ma non in una stringa letterale JavaScript.Se vuoi essere sicuro, puoi evadere, ad esempio:
function parseJSON(s) {
if ('JSON' in window) return JSON.parse(s);
return eval('('+s.replace(/\u2028/g, '\\u2028').replace(/\u2029/g, '\\u2029')+')');
}
Perché stai utilizzando 'eval' in primo luogo? Basta scrivere con: 'var strJson = $ (" # status "). Val(). Replace ("; "," ");' –