Wird es als schlechte Codierungspraxis angesehen, Funktionen in einem Objekt zu speichern, anstatt sie nur zu definieren (und daher global)?
Erwägen:
1.
Foo = {
bar: function() {
alert("baz");
}
}
Foo.bar();
vs.
2.
function bar() {
alert("baz");
}
bar();
Sicher, es könnte etwas weniger Code für das zweite Beispiel sein, aber wenn Sie anfangen, viele Funktionen zu erhalten, wird es chaotisch. Ich finde es viel, viel, sauberer, zum Beispiel zu verwenden, Game.update()
anstatt updateGame () zu verwenden; oder ähnliches. Wenn Sie tiefer gehen, wie Game.notify.admin(id)
und so weiter, erhalten Sie noch schöneren Code.
Gibt es Nachteile beim Speichern einer Funktion in einem Objekt?
Antworten:
Der erste Ansatz ist bevorzugt. Auf diese Weise definieren Sie den Umfang Ihrer Funktionen explizit, anstatt den globalen Bereich zu verschmutzen. Es gibt keine Nachteile bei der Verwendung des ersten Ansatzes. Nur Vorteile :-)
Fazit: Verwenden Sie immer den ersten Ansatz, um Funktionen zu definieren. Das zweite ist wie Javascript in den 90ern. Lassen wir es in Ruhe in der Vergangenheit ruhen und verwenden Sie das richtige Scoping.
quelle
foo.bar.baz()
In diesem speziellen Fall gehen Sie mit dem ersten. Wenn Ihr Foo-Objekt jedoch sehr komplex wird, möchten Sie möglicherweise einen anderen Ansatz verwenden, mit dem Sie einen Konstruktor verwenden können. Und auch der erste Ansatz ist manchmal nicht der beste, wenn es um den Funktionsumfang geht:
function Foo(appName){ this.name = appName; } Foo.prototype.Bar = function(){ alert(this.name) } var a = new Foo("baz"); a.Bar();
quelle
Es gibt keine Magie mit Namespace-Objekten, und Sie werden auch nicht unbedingt Probleme haben, wenn Sie viele globale Variablen verwenden. Der Hauptgrund für die Verwendung von "Namespace" -Objekten besteht darin, das Potenzial für doppelte globale Variablennamen zu verringern. Ein zweiter Grund besteht darin, ähnliche Funktionen der Einfachheit halber zu gruppieren, z.
// Object example (suggested best practice): // DOM functions are under myLib.dom myLib.dom.someDOMFunction0; myLib.dom.someDOMFunction1; // Utility functions are under myLib.util myLib.util.someUtilityFunction0; myLib.util.someUtilityFunction1;
Beachten Sie, dass das oben Genannte praktisch die gleiche Wahrscheinlichkeit für Duplikate aufweist wie ähnlich globale Variablen:
// Global variable example: myLib_dom_someDOMFunction0; myLib_dom_someDOMFunction1; myLib_util_someUtilityFunction0; myLib_util_someUtilityFunction1;
Ersteres wird natürlich im Allgemeinen bevorzugt, da es als einfacher zu handhaben angesehen wird. Ich befürworte nicht, dass Sie den zweiten Ansatz wählen (ich verwende den ersten), sondern nur darauf hinweisen, dass die sogenannte "globale Verschmutzung des Namespace" als Gefahr stark überbewertet wird, obwohl es ein Problem bei der Erstellung vieler globaler Variablen gibt.
quelle