eval
prend une instruction JavaScript ou une expression, mais {...}
serait valide comme une instruction ou une expression, et la grammaire de JavaScript préfère une déclaration.
Comme expression:
{"10000048":"1","25000175":"2","25000268":"3"}
est un objet avec des propriétés (ce que vous voulez).
Comme une déclaration, il est un bloc:
{ // 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
qui donne une erreur.
(étiquettes JavaScript peuvent être utilisés pour marquer une déclaration particulière pour une utilisation avec break
/continue
. Ils sont un peu inutile et presque jamais utilisé.)
Ainsi en ajoutant les parenthèses vous résoudre l'ambiguïté. Seule une expression peut commencer par (
, donc le contenu est analysé dans un contexte d'expression, donnant un objet littéral, pas un contexte d'instruction. Incidemment, ce n'est pas assez assez pour interpréter correctement toutes les valeurs JSON possibles. En raison d'un oubli dans la conception de JSON, les caractères U + 2028 et U + 2029, deux caractères de fin de ligne Unicode obscurs, sont valides pour être mis en échappement dans un littéral de chaîne JSON, mais pas dans un littéral de chaîne JavaScript.Si vous voulez être sûr, vous pouvez leur échapper, par exemple:
function parseJSON(s) {
if ('JSON' in window) return JSON.parse(s);
return eval('('+s.replace(/\u2028/g, '\\u2028').replace(/\u2029/g, '\\u2029')+')');
}
Pourquoi utilisez-vous 'eval' en premier lieu? Il suffit de coller avec:.. 'var strJson = $ ("# status") val() remplacer (";", "");' –