My question is why following is incorrect
function hello () {
    {}.toString();//Unexpected token .
}
But correct with return:
function hello () {
    return {}.toString();
}
No idea how parser works for the incorrect version, is {} treated as BlockStatement? If yes, then why?
Thanks for detail explaination
No idea how parser works for the incorrect version, is {} treated as BlockStatement?
Exactly.
...why?
Purely because that's the way the grammar is designed. { would be ambiguous between starting a block and starting an object initializer when the parser is expecting a statement (which it is there), so the grammar says it starts a block. Thus, { starts a block, } ends it, and the . doesn't make sense because the parser is expecting a statement (or a closing } for the function body).
But in the second example. because the { is after return, the parser is expecting an expression (not a statement), so { starts an object initializer.
Anything to put the parser in a state where it's expecting an expression will make it treat that { as the beginning of an object initializer. Parentheses are commonly used in that case:
function hello() {
    ({}).toString();
}
Of course, that function doesn't do anything, because you're not using the result of toString...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With