2013-02-15 21 views
9

In einer Javascript-Funktion werden Sie verschachtelte Funktionen als Funktionsausdrücke definieren erforderlich oder in einer Funktionskörper Funktionsdeklarationen erlaubt? Zum Beispiel, würde so etwas konform sein?Verschachtelte Funktionen Javascript

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

Oder müssten Sie so etwas tun?

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

ECMA-262 sagt, dass:

Mehrere weit verbreitete Implementierungen von ECMAScript sind dafür bekannt, die Verwendung von FunctionDeclaration als Statement zu unterstützen. Es gibt jedoch signifikante und unüberbrückbare Variationen unter den Implementierungen in der Semantik, die auf solche Funktionsdeklarationen angewendet werden. Aufgrund dieser unversöhnlichen Unterschiede führt die Verwendung einer Funktionsdeklaration als Anweisung zu einem Code, der zwischen Implementierungen nicht zuverlässig portierbar ist. Es wird empfohlen, dass ECMAScript-Implementierungen diese Verwendung von FunctionDeclaration entweder verbieten oder eine Warnung ausgeben, wenn eine solche Verwendung auftritt. Zukünftige Ausgaben von ECMAScript können alternative tragbare Mittel zum Deklarieren von Funktionen in einem Anweisungskontext definieren.

Bedeutet dies, dass eine Funktionsdeklaration in einem Funktionskörper technisch falsch ist, oder habe ich das komplett falsch verstanden? Ich habe gehört, dass Leute den Körper als einen Block bezeichnen, der laut dem Standard eine oder mehrere Aussagen ist, aber ich bin mir nicht sicher.

+2

Ich bin nicht sicher, was der Standard ist, scheint ein wenig verwirrend, aber ehrlich gesagt habe ich noch nie Verschachtelung Funktionsdeklarationen in IE8 + und allen anderen Browsern Probleme. – elclanrs

Antwort

5

FunctionDeclaration die sind sicher in der Funktion Körper erlaubt, und es gibt keine Bugs, die ich bewusst bin.

Alles ist ziemlich klar, sobald man ES5 production rules sehen

FunctionBody 
    SourceElements (opt) 

SourceElements 
    SourceElement 
    SourceElements SourceElement 

SourceElement 
    Statement 
    FunctionDeclaration 

Mit anderen Worten enthalten Funktionskörper Quellenelemente und Quellenelement ist entweder eine Erklärung oder ein FunctionDeclaration. Daher kann FunctionDeclaration Teil eines Funktionskörpers sein.

Die Klausel, die Sie über "... Implementierungen von ECMAScript ... zur Unterstützung der Verwendung von FunctionDeclaration als Anweisung" erwähnten, bezieht sich auf die Verwendung von FunctionDeclaration als Anweisung, aber nicht direkt im Funktionsrumpf. Es wird Bezug auf Fälle wie:

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

, dass ein nicht-standardisiertes Verhalten. Schauen Sie sich mehr zu diesen function statements.

+0

Wow - Kangax - cool. Erinnere ich mich daran, etwas auf der ES.next-Seite richtig gesehen zu haben, als ich tatsächlich Funktionsdeklarationen auf Blockebene wie diesen Teil der Sprachspezifikation gemacht habe? –

+0

Ja, ich denke, sie versuchen das zu standardisieren. IIRC Es gab auch einige Änderungen in den neuesten Motoren im strikten Modus. – kangax

Verwandte Themen