Namespace vs selbstaufrufende Funktionen [geschlossen]

8

Ich habe eine Frage: Was ist der bessere Ansatz, um den Umfang in Javascript zu begrenzen: Verwenden Sie einen Namespace wie folgt:

%Vor%

oder sollte ich die selbstaufrufende Funktion wie folgt verwenden

%Vor%

Ist es immer gut, einen Namensraum zu haben, oder kann ich ihn weglassen, wenn ich nur eine große selbstaufrufende Funktion verwende, in die ich all meine Sachen lege?

    
Keen 07.09.2012, 08:14
quelle

4 Antworten

7

Beide Code-Beispiele haben sehr unterschiedliche Anwendungen.

NAMESPACE.foo = function(){} und (function(){})() sind beide Funktionsausdrücke und begrenzen (genau wie Funktionsdeklarationen) den inneren Bereich und haben Zugriff auf vars / Funktionen in ihren äußeren Bereichen.

Der Hauptunterschied besteht darin, dass Sie mit dem Namespace die Funktion an einer beliebigen Stelle aufrufen können, die sich im selben Bereich wie der Namespace befindet, während das IIFE nur ausgeführt wird, wenn es gefunden wird.

Es gibt keine "Best Practice" ohne Kontext, also werde ich einige Beispiele nennen:

  • Wenn Ihr Funktionsausdruck nur einmal ausgeführt werden soll, wird ein IIFE die Arbeit sehr gut erledigen, während ein Namespace etwas Speicher benötigt, bis es Müll gesammelt wird.
  • Wenn Ihr Funktionsausdruck mehrere Male ausgeführt wird (z. B. in einer for -Schleife), führt ein IIFE zu einem Leistungsverlust (und nicht wird von JSLint , oder irgendjemand in der Tat). Es ist besser, ein definiertes Funktionsobjekt zu haben, das Sie mehrmals aufrufen, als ein neues Funktionsobjekt für jede Iteration zu erstellen.
  • Letztendlich kommt es auf Ihren Benutzerfall an. IIFEs werden ausgeführt, wenn sie angetroffen werden (z. B. Programm- / Funktionskörper, IF-Block usw.), während ein Namespace das Funktionsobjekt speichert und es ermöglicht, sie bei Bedarf aufzurufen, vorausgesetzt, sie ist im angegebenen Bereich verfügbar.

Lesematerial

Fabrício Matté 07.09.2012 08:33
quelle
3

Was ich tue, ist, die zwei zu kombinieren. Ich bin mir nicht sicher, ob dies als best practice gilt, aber es funktioniert für mich:)

%Vor%

members A und B werden in separaten js Ressourcendateien definiert - gebündelt und für die Produktion minimiert! Ich finde, dies gibt eine schöne Trennung von Bedenken beim Aufbau von OO JS.

    
simonlchilds 07.09.2012 08:30
quelle
0

Mit einem Namespace wird etwas in den globalen Bereich eingefügt.

Wenn Sie alles in eine Funktion einschließen und nur lokal begrenzte Variablen verwenden, funktioniert das nicht.

Letzteres ist eindeutig besser, um den Anwendungsbereich einzuschränken.

Verwenden Sie einen Namespace, wenn Sie Teile Ihres Codes einem anderen Code auf der Seite (der für Bibliotheken typisch ist) zur Verfügung stellen müssen. Definieren Sie alle Teile davon jedoch innerhalb einer Funktion, da dies die Wahrscheinlichkeit verringert, dass Daten in global umgewandelt werden, und Ihnen eine Sperrung für gemeinsame private Daten im Namespace bietet.

    
Quentin 07.09.2012 08:16
quelle
0

Sie sollten Ihren gesamten Code in eine selbstaufrufende Funktion einfügen. Wenn Sie einige Funktionen mit anderen Teilen der App teilen müssen, weisen Sie diese Methoden Ihrem benutzerdefinierten Namespace zu. Auf diese Weise geben Sie nur genau das an, was Sie brauchen.

    
armen.shimoon 07.09.2012 08:27
quelle

Tags und Links