Pourquoi JavaScript eval besoin des parenthèses pour eval données JSON?
J'ai appris (à la dure) que j'ai besoin d'ajouter des parenthèses autour des données JSON, comme ceci:
stuff = eval('(' + data_from_the_wire + ')');
//where data_from_the_wire was, for example {"text": "hello"}
(Dans Firefox 3, au moins).
Quelle est la raison derrière tout cela? Je déteste écrire du code sans comprendre ce qui est derrière le capot.
- Je vois que vous n'êtes pas un locuteur natif anglais, mais '(' et ')' sont entre parenthèses. Il peut aider d'autres personnes à trouver votre post si vous en corriger.
Vous devez vous connecter pour publier un commentaire.
De mettre des parenthèses autour de
data_from_the_wire
est en fait l'équivalent deSi vous étiez à eval sans les parenthèses, puis le code devrait être évaluée, et si vous aviez un nom de fonctions à l'intérieur d'elle ceux qui seraient définis, mais n'est pas retourné.
Prendre comme exemple la possibilité d'appeler une fonction comme il le han été créé:
Appelle la fonction qui vient d'être défini. La suite, cependant, ne fonctionne pas:
Nous voyons donc que les parenthèses efficacement tournez ensuite le code dans une expression qui renvoie, plutôt que de simplement l'exécution de code.
eval()
, doivent être placés entre parenthèses. @karim79 la réponse est plus claire sur ce point: le JSON littérale du{...}
serait analysée comme bloc mais pas littéral d'objet (qui doit l'être).eval
accepte une séquence d'instructions Javascript. Le parser Javascriptinterprète le ‘{’ token, se produisant dans un énoncé comme le début d'un bloc et non le début d'un objet littéral.
Lorsque vous placez votre littérale dans les parenthèses comme ceci:
({ data_from_the_wire })
vous passez le parser Javascript dans l'expression mode d'analyse. Le jeton ‘{’ à l'intérieur d'une expression signifie le début d'un objet littéral de déclaration et de pas un bloc, et donc Javascript accepte comme un objet littéral.
Je ne suis pas sûr de la raison, mais je parser JSON en utilisant la classe JSON de json.org. Il est beaucoup plus sûr que d'utiliser eval.
JSON.parse
aveceval("(" + response + ")")
est une nécessité.En JavaScript, les accolades sont utilisées pour créer des blocs d'instructions:
Les lignes ci-dessus peut être mis à l'intérieur d'une chaîne de caractères et
eval
zanne, sise sans problème. Maintenant, considérez ceci:Les accolades cause le moteur JavaScript pense que c'est un groupe d'expression, d'où l'erreur de syntaxe autour de la
:
caractère. Citation de MDN...JavaScript Guide...Littéraux d'Objet:La solution d'emballage de l'objet littéral à l'intérieur de
()
œuvres en disant le moteur pour traiter son contenu comme une expression, non pas comme un bloc de déclaration. Donc cela ne fonctionne pas:Mais ce n':
Cela se produit parce que sans tour accolades JavaScript tente d'interpréter
{"text": ...
comme une étiquette et échoue. Essayez-la dans la console et vous obtiendrez "étiquette non valide" erreur.Il dépend de la valeur de
data_from_the_wire
, en fait. Dans la plupart des cas, votre syntaxe est ok, mais une ligne qui commence avec{
est analysée comme une étiquette, et le vôtre n'est pas valide. Si vous l'entourent avec la parenthèse, il empêche l'analyseur d'une mauvaise interprétation de votre expression.Juste une analyse de problème, vraiment. Avec des chaînes de caractères, de chiffres ou de fonctions, tu n'aurais pas ce problème.
Une solution est toujours eval instructions et de ne pas les expressions. Vous pouvez écrire
Je ne sais pas, et je suis vraiment intéressé par la réponse à cette question, mais je pense que sans les parenthèses les données dans
data_from_the_wire
pourrait être interprété comme une fermeture. Peut-être que les parenthèses de la force de l'évaluation et de sorte que le tableau associatif est 'retourné'.C'est le genre de deviner qui mène à downvotes bien =).
MODIFIER
Douglas Crockford mentionne une syntaxe ambiguïté sur son JSON site mais ça n'a pas vraiment m'aider.