Pourquoi la console Google Chrome lance "SyntaxError: jeton inattendu}" lorsqu'il est entré (

Dans la console de Google Chrome, lorsque nous entrons

( 

Et Enter, Chrome dit "SyntaxError: jeton inattendu}" Pourquoi? L'entrée est juste "(", y compris non "}".

Nous obtenons la même erreur lorsque nous entrons

 console.log( 

Il n'y a pas "}"!!!

Le jeton suivant devrait être la liste des arguments ou ")", donc le message d'erreur devrait être "Liste des arguments attendus" ou "Non divulgué" (ou quelque chose).

Et je veux savoir, l'entrée de la console est-elle analysée comme StatementList(opt) (définie dans ECMA-262)?

Edit: J'ai trouvé le code exact qui est évalué. Le code se trouve dans "src / third_party / WebKit / Source / WebCore / inspector / InjectedScriptSource.js".

Avant que la console Chrome n'évalue votre code, elle l'enveloppe dans un bloc with pour que les fonctions de la ligne de commande atteignent leur portée. Donc, ce que vous tapez est réellement évalué à l'intérieur des appareils. Le jeton "}" inattendu est celui mis automatiquement par Chrome.

Le code que Chrome passe à eval est

 with ((window && window.console && window.console._commandLineAPI) || {}) { <your code here> }; 

Parce qu'il s'agit d'une simple substitution de texte, l'exemple suivant fonctionne et le résultat est un objet que vous pouvez développer pour voir la propriété de answer :

 } 0, { answer: 42 

Lequel (reformaté) est équivalent à:

 with ((window && window.console && window.console._commandLineAPI) || {}) { } 0, { answer: 42 }; 

Le } ferme au début with bloc. La partie 0, est nécessaire pour forcer le texte de l'objet à être analysé comme une expression au lieu d'un autre bloc. Ensuite, la { answer: 42 est le début d'un objet littéral qui se ferme par le jeton inséré } .

Pour plus de plaisir, voici quelques autres entrées qui fonctionnent (et leurs résultats):

 > }{ // an empty block, so no value undefined > }!{ // !{} === false false > }!!{ // !!{} === true true > } +{ valueOf: function() { return 123; } 123