2013-03-01 17 views
5

Witam Jestem nowy w obsłudze Javascript i czytam ostateczną wersję Oreilly's Javascript. W sekcji deklaracji oświadczenie mówi:Czy deklaracja funkcji nie może występować w instrukcji warunkowej?

enter image description here

Zrobiłem prosty test:

var a = 1; 
while(a < 5){ 
    a++; 
    function double(a){return a * 2 }; 
    console.log(double(a)); 
}  

Wydaje się node.js nie daje mi żadnego błędu i uruchom jako spodziewać. Wszelkie uwagi na ten temat?

+2

Uruchom go w trybie ścisłym, a otrzymasz swój błąd. Jest to nieprawidłowa składnia * (z wyjątkiem sytuacji, w której Mozilla może implementować JS, o ile dozwolona jest podobna składnia) *, ale historycznie było to dozwolone przez implementacje. –

Odpowiedz

-1

To nie prawda. Należy jednak pamiętać, że mogą nie zachowywać się tak, jak można się spodziewać.

Na przykład, to będzie działać:

if(false) { 
    function double(a) {return a*2;}; 
} 
else { 
    console.log(double(4)); 
} 

Choć może uważasz, że funkcja nie jest określona z powodu bycia wewnątrz if że nigdy nie zostanie osiągnięty, funkcja ta jest w rzeczywistości wywieszono na górze bieżący "blok" (czy to funkcja zawierająca funkcję, czy cały znacznik lub plik <script>) i dlatego są dostępne w dowolnym miejscu.

Ty nie należy umieścić function definicje wewnątrz bloku if, ale nie ma powodu, dlaczego nie można.

+1

jest wiele powodów, dla których nie powinieneś - 1. specyfikacja mówi, że nie, 2. w niektórych przeglądarkach to nie działa! – Alnitak

+0

@Alnitak Powiedziałem konkretnie, że nie powinieneś. Jednak zgodnie ze specyfikacją przy podnoszeniu jest dokładnie taka sama jak "var". –

+0

Jest nieważny zgodnie ze specyfikacją, więc specyfikacja opisująca "podnoszenie" * (termin nie używany w specyfikacji) * nie ma zastosowania. Wdrożenia mogą na to pozwolić i mogą traktować jego podnoszenie tak samo, ale nadal nie są ważne. –

Powiązane problemy