2016-07-04 13 views
1

Der folgende Code gab einen Fehler, auf einige Version in Firefox Browser - linksHandle is not defined.Schließen und Funktion hissen - funktioniert nicht auf Firefox

Der Code besteht aus einer Funktion, die am unteren Rand eine Funktion namens LinksHandle hat. Soweit ich weiß, soll diese Funktion ausgelöst werden, wenn die Funktion, in der sie definiert ist, aufgerufen wird.

Daher sollte die für das Ereignis 'mMenuReady' definierte Funktion darauf zugreifen können, da sie alle Funktionen und Variablen enthält, die in ihrem Ausführungskontext definiert wurden.

Warum benötigen einige Firefox-Versionen die zuvor definierte Funktionsdeklaration (linksHandle), damit der Callback 'mmenu' die Funktion umschließt?

document.addEventListener('readystatechange', function() { 
    if (document.readyState === 'interactive') { 

     if (typeof jQuery === 'function') { 
      // callback function that is invoked later by the event that is triggered -> $(window).trigger("mMenuReady") 
      $(window).on('mMenuReady', function() { 
       var links2 = Array.prototype.slice.call(document.querySelectorAll('#mm-mainMenu a')); 
       links2.forEach(linksHandle); 
      }); 
     } 

     function linksHandle(elem) { 
      // function code 
     } 
    } 
}); 

Antwort

1

Function declarations inside blocks sind nur seit ES6 erlaubt. Sie hissen innerhalb Ihres if Körpers (nicht zur ganzen Funktion), aber nicht in älteren Versionen von FF, die sie als "function statements" implementierten, die nicht gehisst wurden (und wirklich completely invalid in strict mode) haben caused issues like yours.

+0

wenn der Code nicht innerhalb des if-Blocks war und direkt in der Funktion dekaliert wurde. war die innere Funktion in ES6 gehisst? meine frage ist die if-aussage hat einen einfluss auf das hissen der funktion? – user3021621

+0

Ja, Function-Level-Funktionsdeklarationen werden im Bereich der Funktionsebene gehisst. – Bergi

+0

aber in fortgeschrittenen ES ist die Funktion auch in if-Blöcken gehisst? – user3021621