Keine Ahnung, wie Parser für die falsche Version funktioniert, wird {} als BlockStatement behandelt?
Genau.
... warum?
Nur weil das die Grammatik ist. {
wäre mehrdeutig zwischen dem Starten eines Blocks und dem Starten eines Objektinitialisierers, wenn der Parser eine Anweisung erwartet (welche it is there), so sagt die Grammatik, dass es einen Block startet. {
startet also einen Block, }
beendet es, und .
macht keinen Sinn, weil der Parser eine Anweisung erwartet (oder eine schließende }
für den Funktionskörper).
Aber im zweiten Beispiel. Da der {
nach return
ist, ist der Parser expecting an expression (keine Anweisung), also startet {
einen Objektinitialisierer.
Alles, um den Parser in einen Zustand zu versetzen, in dem er einen Ausdruck erwartet, wird dafür sorgen, dass {
als Anfang eines Objektinitialisierers behandelt wird. Klammern werden in diesem Fall häufig verwendet:
function hello() {
({}).toString();
}
Natürlich, dass Funktion nichts tut, weil Sie nicht das Ergebnis von toString
mit ...
Mehr syntaktisch korrekten Beispiele: 'var x = {} .toString(); ({}). toString(); ({} .toString()); falsch || {} .toString(); 'So ist Ihre Vermutung wahrscheinlich richtig –