2013-02-15 15 views
9

In una funzione Javascript, è necessario definire funzioni annidate come espressioni di funzione o dichiarazioni di funzione consentite in un corpo di funzione? Ad esempio, qualcosa del genere sarebbe conforme?Funzioni nidificate Javascript

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

Oppure dovresti fare qualcosa del genere?

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

ECMA-262 dice che:

diverse implementazioni ampiamente usati di ECMAScript sono noti per sostenere l'uso di FunctionDeclaration come una dichiarazione. Tuttavia ci sono variazioni significative e inconciliabili tra le implementazioni nella semantica applicata a tali dichiarazioni di funzioni. A causa di queste differenze inconciliabili, l'uso di una FunctionDeclaration come Statement genera un codice che non è affidabile tra le implementazioni. Si raccomanda che le implementazioni ECMAScript non consentano l'uso di FunctionDeclaration o emettano un avviso quando si riscontra tale utilizzo. Le future edizioni di ECMAScript possono definire mezzi portatili alternativi per la dichiarazione di funzioni in un contesto di Statement.

Questo significa che una dichiarazione di funzione nel corpo di una funzione è tecnicamente errato, o che hanno ho ottenuto questo completamente sbagliato? Ho sentito persone riferirsi al corpo come un blocco, che secondo lo standard, è una o più affermazioni, ma non ne sono sicuro.

+2

Non sono sicuro di quale sia lo standard, sembra un po 'confuso, ma onestamente non ho mai avuto problemi con le dichiarazioni delle funzioni di nidificazione in IE8 + e in tutti gli altri browser. – elclanrs

risposta

5

FunctionDeclaration sono certamente consentite nel corpo della funzione e non ci sono bug di cui sono a conoscenza.

E 'tutto abbastanza chiaro una volta che si guarda a ES5 production rules

FunctionBody 
    SourceElements (opt) 

SourceElements 
    SourceElement 
    SourceElements SourceElement 

SourceElement 
    Statement 
    FunctionDeclaration 

In altre parole, corpo della funzione include elementi di origine, ed elemento di origine è sia una dichiarazione o un FunctionDeclaration. Quindi FunctionDeclaration può essere parte di un corpo di una funzione.

La clausola che ha menzionato su "... implementazioni di ECMAScript ... noto per supportare l'uso di FunctionDeclaration come Statement" si riferisce all'utilizzo di FunctionDeclaration come Statement, ma non direttamente nel corpo della funzione. Si riferisce a casi come:

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

Questo è un comportamento non standardizzato. Scopri di più su questi function statements.

+0

Wow - Kangax - cool. Ricordo che ho visto correttamente qualcosa nella pagina ES.next riguardo alle dichiarazioni di funzioni a livello di blocco come questa parte della specifica del linguaggio? –

+0

Sì, penso che stiano cercando di standardizzare questo. IIRC ci sono stati anche alcuni cambiamenti negli ultimi motori in modalità rigorosa. – kangax