2009-10-11 13 views
8

Dlaczego to spowodować błąd składni instrukcji return:JavaScript Whitespace Syntax Error

var FOO = (function($) 
{ 
    return 
    {  
     init: function() 
     { 

     } 
    } 
})(jQuery); 

niniejsza nie:

var FOO = (function($) 
{ 
    return {  
     init: function() 
     { 

     } 
    } 
})(jQuery); 

Dlaczego istnieje różnica?

+0

możliwy duplikat [Jakie są zasady automatycznego wstawiania średników w języku JavaScript (ASI)?) (Http://stackoverflow.com/q/2846283/1048572) – Bergi

+0

@Bergi technicznie to pytanie byłoby duplikatem tego, odkąd przyszedł pierwszy;) Ale nacisk i "przeszukiwalność" są różne (np. nie chcę tego pytania skasowane) – drzaus

+0

@drzaus: Powielone zamknięcia nie muszą ściśle przestrzegać zlecenia czasowego - mamy wiele pytań kanonicznych, które były zapytałem później, ale mam odpowiedzi o wyższej jakości :-) Zauważ, że chciałem tylko powiązać ten powiązany, bardzo trafny post (nie jest to dokładny dupek), nie zamknąłem tego pytania (nie głosowałem). Również zamknięte pytania nie są usuwane. – Bergi

Odpowiedz

21

Tu nie chodzi o białą przestrzeń, chodzi o automatyczne wstawianie średnika przez JavaScript.

specyfikacji ECMAScript mówi

Pewne ECMAScript oświadczenia (pusty oświadczenie, zmienna oświadczeniu rachunku wypowiedzi, do-while oświadczeniu kontynuować oświadczenie, break oświadczenie, instrukcja return i rzucać oświadczenie) musi zakończone średnikami . Takie średniki mogą zawsze pojawiać się jawnie w tekście źródłowym. Dla wygody jednak takie średniki można w pewnych sytuacjach pominąć w źródłowym tekście . Te sytuacje są opisane przez , mówiąc, że średniki są automatycznie wstawiane do źródła kodu źródłowego kodu w tych sytuacjach.

Oznacza to, że Twój kod

var FOO = (function($) 
{ 
    return 
    {  
     init: function() 
     { 

     } 
    } 
})(jQuery); 

pobiera tłumaczone jako

var FOO = (function($) 
{ 
    return; // <- JavaScript will insert a semicolon here. 

    {  
     init: function() 
     { 

     } 
    } 
})(jQuery); 

So FOO będzie niezdefiniowana po funkcja jest wykonywana.

Dla twojego innego kodu, JS nie wstawi żadnego średnika i będzie działało poprawnie JS wstawi średnik po twoim dosłownym obiekcie i powinien działać poprawnie. [EDYCJA: Korekta jak wskazano przez kagnax]

Oznacza to, że zawsze powinieneś wypowiedzieć swoje instrukcje średnikiem. Pozwolenie wstawieniu średnika silnika JS może wprowadzać bardzo subtelne błędy, które wymagałyby wielu godzin debugowania. Możesz użyć narzędzia takiego jak JSLint, które będzie ostrzegać o brakujących średnikach.

+3

Właściwie dla jego "innego kodu" JS ** wstawi ** średnik, ale tylko po literale obiektu - jak wyjaśniono w sekcji specyfikacji, którą zacytowałeś - * ReturnStatement * s są kandydatami do ASI :) – kangax

+0

kangax, nie zauważyłem, że w jego drugim dosłownym również brakowało średnika. Zaktualizuję odpowiedź. – SolutionYogi

+0

Niektóre wygody, co? Nie zdawałem sobie sprawy, że Javascript będzie kolidował z moim kodem, powodując tak subtelne, ale głębokie modyfikacje. Nie chcę tego "przekonania". +1 dla objaśnionego wyjaśnienia – mfeingold