2016-11-25 7 views
7

Meine Frage ist, warum folgendeJavascript unerwartetes Token. mit `{} .toString()`

function hello() { 
    {}.toString();//Unexpected token . 
} 

Aber richtig mit return falsch ist:

function hello() { 
    return {}.toString(); 
} 

Keine Ahnung, wie Parser für die falsche Version arbeitet, ist {} behandeltem als BlockStatement? Wenn ja, warum?

Dank für das Detail explaination

+0

Mehr syntaktisch korrekten Beispiele: 'var x = {} .toString(); ({}). toString(); ({} .toString()); falsch || {} .toString(); 'So ist Ihre Vermutung wahrscheinlich richtig –

Antwort

8

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 ...

+0

Thanks @ T.J. Du hast mich gerade gerettet. Es hat mich fast umgebracht, obwohl ich einige Annahmen habe. Schätze wirklich deine Hilfe – Howard