Anonyme Funktion vs. separate benannte Funktion zur Initialisierung in jquery

9

Nehmen wir an, wir haben Code, der zum Initialisieren von Dingen verwendet wird, wenn eine Seite geladen wird, und er sieht folgendermaßen aus:

function initStuff() { ...}
...
$(document).ready(initStuff);

Die initStuff-Funktion wird nur aus der dritten Zeile des Snippets aufgerufen. Nie wieder. Normalerweise setzen die Leute dies in einen anonymen Rückruf wie folgt:

$(document).ready(function() { 
    //Body of initStuff
});

Die Funktion an einer bestimmten Stelle im Code zu haben, hilft nicht wirklich bei der Lesbarkeit, da beim Aufruf von ready () deutlich wird, dass es sich um Initialisierungscode handelt.

Gibt es noch andere Gründe, einen dem anderen vorzuziehen?

Martin N.
quelle
4
Der erste überfüllt den globalen Namespace. Wählen Sie die zweite.
Riwalk

Antworten:

10

Wie bei @ Stargazer712 erwähnt, überfüllt der erste den globalen Namespace, sodass der zweite meiner Meinung nach der Gewinner ist. Da Sie im zweiten Beispiel eine anonyme Funktion verwenden, ist der Callstack Ihres Debuggers unbrauchbar und führt je nach verwendetem Debugger zu unterschiedlichen Ergebnissen. Normalerweise mache ich am Ende Folgendes:

$(document).ready(function MODULE_init() { 
    //Body of initStuff
});

Auf diese Weise wird der globale Namespace nicht unübersichtlich und Sie haben einen nützlichen Callstack.

Ich neige dazu, die obige Konvention in allen anonymen (naja, nicht mehr anonym;)) Funktionsdefinitionen zu verwenden. Dies ist eine Konvention, die ich beim Durchsuchen von Firefox JS-Code gefunden habe.

Bearbeiten: Nachdem Oliver das alles gesagt hat, bringt er einen guten Punkt mit Unit-Tests vor. Das Obige soll als Wrapper für komplexere Operationen dienen und nicht eine Tonne ungetesteten Codes enthalten.

Demian Brecht
quelle
+1 Zum Erwähnen des Debuggens. Ich habe oft die Verwendung von "benannten Rückrufen" (ich weiß nicht, ob dieser Begriff tatsächlich existiert) in Node.js Code gesehen, daher denke ich auch, dass dies eine gute Praxis ist.
Oliver Weiler
kangax.github.com/nfe Ausdrücke für benannte Funktionen - Dieser Artikel enthält alles, was Sie schon immer über sie wissen wollten.
Sean McMillan
7

Ich würde in diesem Fall sagen, dass es wahrscheinlich keine Rolle spielt, aber wenn Sie anonyme Rückruffunktionen haben und andere anonyme Rückruffunktionen aufrufen, tendiere ich dazu, den ersten Ansatz zu verwenden, da dadurch der Code viel lesbarer und leichter zu befolgen ist.

In Bezug auf Unit-Tests wäre der erste Ansatz besser, da Sie die initstuffFunktion isoliert testen könnten .

Oliver Weiler
quelle
Normalerweise haben wir in diesen Initialisierungsfunktionen nicht viel Code. Es kann einige Daten von einigen Stellen
Martin N.
3

Ich würde mich für den ersten entscheiden, für Lesbarkeit / Debugging / Testen usw. Sie können das Problem der globalen Namespace-Unordnung vermeiden, indem Sie einfach einen lokalen Namespace für alle Funktionen auf Ihrer Seite erstellen. Ich verwende den von Paul Irish empfohlenen Objektnotationsstil (siehe Folien 13-15 auf http://paulirish.com/2009/perf/ ).

var MYPAGE = {
  onReady : function(){
  // init code
  },
  someOtherCallback : function(){}
};

jQuery(document).ready(MYPAGE.onReady);
Njaggars
quelle
2

Es gibt auch eine dritte Möglichkeit, Init-Methoden zu registrieren, ohne den globalen Namespace zu überladen, den ich bevorzuge:

jQuery(function(){....});

Es ist kurz und vermeidet das Nachschlagen von DOM-Dokumenten

jQuery(document).ready(function(){...}); 

tut.

Alex
quelle
+1: Ich denke, dies ist Standardpraxis, aber um Probleme mit widersprüchlichen Definitionen von zu vermeiden, $bevorzuge ich:jQuery(function($) {...});
Kevin Cline