Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is this a problem with ASI or just the return grammar?

Tags:

javascript

People often talk about JavaScript's nasty ASI (Automatic Semicolon Insertion), and often cite this example...

function a() {
    return [
        'a',
        'b',
        'c'
    ];
}

function b() {
    return
    [
        'a',
        'b',
        'c'
    ];
}

console.log(a(), b());
// ["a", "b", "c"] undefined

Is there really a semicolon being inserted after return in b(), or does the JavaScript grammar state that the return value must explicitly be stated after it (i.e. no \n)?

like image 206
alex Avatar asked Oct 12 '22 14:10

alex


1 Answers

I don't think there's a semicolon "inserted". It's just that there's a parse ambiguity there, and the resolution is to treat the "return" and the following expression as two separate statements. I understand why it makes sense from a purely grammatical standpoint, but it seems like a weird decision in the specific case of the "return" statement as the decision is guaranteed to leave a never-executed orphan expression statement dangling after it.

I wonder how many aggregate SO rep points that trick has generated?

edit 04 Apr 2014 — technically that decision to split the statement into two statements is called "semicolon insertion". Nobody actually sees the inserted semicolon; it's a figment of the parser's imagination :) The effect is the same whatever you call it.

like image 90
Pointy Avatar answered Oct 14 '22 21:10

Pointy