Search code examples
javascriptspecificationsecmascript-5automatic-semicolon-insertion

Automatic semicolon insertion & return statements


As you might know, ECMAscript tries to be smart and will automatically insert semicolons if you didn't write those explicitly. Simple example

function foo() {
    var bar = 5

    return bar
}

will still work as expected. But there are some caveats if you rely on that. If we re-write that function like so

function foo() {
    var bar = 5

    return
    {
        bar: bar
    }
}

..that function would now return undefined because the interpreter would insert that semicolon right after the return statement (that's a reason why you always should bring curly brackets on the same line as a statement).

However, knowing all this I'm wondering now how safe a return statement like the following is, across browsers and versions

function foo() {
    var a = true,
        b = true,
        c = false;

    return a 
            && b
            && c;
}

I just wrote a similar return statement in a production environment. Just because I knew about the "problems" with ECMAscript beeing not-so-smart about semicolon insertion I'm wondering now, if that code works 100%. In my first tests on FF/Chrome/IE (latest versions) this seems to be totally fine, but is it really?

Does the automatic semicolon insertion "wake-up" if there is anything else but the return statement in that line? Can anyone provide implementation-level detail about this?


Solution

  • The javascript interpreter/compiler is so smart to only insert automatic semicolons if afterwards there is valid Javascript.

    Your code works, because && b as it stands is no valid expression - that's why no semicolon gets inserted after the return a resulting in:

    return a && b && c;
    

    However:

    return (undefined);//implicitely inserted
    {
        ....
    }
    

    is perfectly valid and thats why a semicolon gets inserted.

    For completeness' sake the ref to the spec: automatic semicolon insertion. THe examples are worth reading through.