2013-02-15 11 views
9

Czy w funkcji JavaScript konieczne jest zdefiniowanie funkcji zagnieżdżonych jako wyrażeń funkcji lub czy deklaracje funkcji są dozwolone w treści funkcji? Na przykład, czy coś takiego byłoby zgodne?Funkcje zagnieżdżone Javascript

function a() { 
    function b() { 
     function c() { 
      window.alert(3); 
     } 
     window.alert(2); 
    } 
    window.alert(1); 
} 

Czy musiałbyś zrobić coś takiego?

function a() { 
    var a = function() { 
     var c = function() { 
      window.alert(3); 
     } 
     window.alert(2); 
    } 
    window.alert(1); 
} 

ECMA-262 mówi, że:

Kilka powszechnie używanych implementacje ECMAScript są znane obsługują FunctionDeclaration jako oświadczenie. Istnieją jednak znaczące i nie dające się pogodzić warianty pomiędzy implementacjami w semantykach zastosowanych do takich zgłoszeń FunctionDeclarations. Ze względu na te nie dające się pogodzić różnice, użycie funkcji FunctionDeclaration jako Statement skutkuje kodem, który nie jest niezawodnie przenośny wśród implementacji. Zaleca się, aby implementacje ECMAScript uniemożliwiały korzystanie z funkcji FunctionDeclaration lub wyświetlały ostrzeżenie po napotkaniu takiego użycia. Przyszłe wydania ECMAScript mogą definiować alternatywne przenośne środki do deklarowania funkcji w kontekście instrukcji.

Czy to oznacza, że ​​deklaracja funkcji w treści funkcji jest nieprawidłowa pod względem technicznym, czy też jest to całkowicie błędne? Słyszałem, że ludzie odnoszą się do ciała jako blok, który zgodnie ze standardem jest jednym lub więcej stwierdzeniami, ale nie jestem pewien.

+2

Nie jestem pewien, jaki jest standard, wydaje się nieco zagmatwany, ale szczerze mówiąc, nigdy nie miałem problemów z deklaracjami funkcji zagnieżdżania w IE8 + i wszystkich innych przeglądarkach. – elclanrs

Odpowiedz

5

FunctionDeclaration są na pewno dozwolone w treści funkcji i nie mam żadnych błędów, o których jestem świadomy.

To wszystko jest całkiem jasne, gdy spojrzeć na ES5 production rules

FunctionBody 
    SourceElements (opt) 

SourceElements 
    SourceElement 
    SourceElements SourceElement 

SourceElement 
    Statement 
    FunctionDeclaration 

Innymi słowy, ciało funkcji zawiera elementy źródłowe, a elementem źródłem jest albo komunikat lub FunctionDeclaration. Dlatego FunctionDeclaration może być częścią ciała funkcji.

Klauzula, o której wspomniałeś o "... implementacjach ECMAScript ... znanych z obsługi funkcji FunctionDeclaration jako Statement" odnosi się do użycia FunctionDeclaration jako Statement, ale nie bezpośrednio w treści funkcji. Dotyczy to takich przypadków jak:

if (...) { 
    function f() {} 
} 

Jest to zachowanie niestandaryzowane. Sprawdź więcej na tych function statements.

+0

Wow - Kangax - fajne. Czy pamiętam, że poprawnie widziałem coś na stronie ES.next o tworzeniu deklaracji funkcji na poziomie bloków, takich jak ta część specyfikacji językowej? –

+0

Tak, myślę, że próbują to ujednolicić. IIRC nastąpiły również pewne zmiany w najnowszych silnikach w trybie ścisłym. – kangax

Powiązane problemy