2016-03-14 38 views
5

Qualcuno può aiutarmi - perché abbiamo questo comportamento nello snippet JS?JS Strano comportamento

var foo = function() { 
    return { 
     hi: console.log("foo") 
    } 
} 

var foo1 = function() { 
    return 
    { 
     hi: console.log("foo1") 
    } 
} 

foo(); 
foo1(); 

Perché viene stampato solo "pippo"?

fiddle

EDIT ok, questo è causa di inserimento automatico e virgola, MA

dobbiamo alcuni modi per forzare JS di non eseguire questi casi?

Voglio dire, possiamo fare qualcosa che genererà un errore qui?

EDIT2

Sembra miglior suggerimento è JShint - ho chiesto here

+0

Solo un sospetto ma potrebbe essere una cosa di temporizzazione? Se commentate 'foo()' allora viene stampato 'foo1'. So che 'console.log' alcune strane soluzioni nella registrazione del log se questo ha senso. – ste2425

+0

In particolare un duplicato di http://stackoverflow.com/a/3721802/476 – deceze

+0

@deceze, allora perché funziona bene se 'foo()' è commentato? – ste2425

risposta

8

Hai colpito di JavaScript automatic semi-colon insertion. Il tuo secondo blocco è l'equivalente di:

var foo1 = function(){ 
    return; 
    { 
    hi:console.log("foo1") 
    } 
} 

IE non è restituendo l'oggetto letterale a tutti (e quindi il console.log non è in esecuzione) - è solo il ritorno undefined.

2

In foo1, la funzione ritorna prima che l'oggetto venga valutato. Se si controlla l'output di foo1(), non restituisce nulla. Questo è il motivo per cui la maggior parte delle guide di stile javascript suggeriscono oggetti aperti sulla stessa riga della parola chiave return.