19 Stimmen

Wird das Festlegen von Eigenschaften für das Window-Objekt als schlechte Praxis angesehen?

Ich schreibe eine ziemlich komplexe JavaScript-Anwendung, die eine MVC-Architektur hat, die ich mit Prototype's implementiere Class Unterstützung und das Modulmuster. Die Anwendung verwendet AJAX und das Observer-Muster. Ich erstelle meine Controller-Instanz, wenn das DOM geladen ist, übergebe ihr eine Ansicht und einige Modelle, die aus JSON-Daten erstellt wurden, und los geht's.

Ich habe jedoch festgestellt, dass ich meine Controller-Instanz als Eigenschaft auf der Window Objekt - d.h. deklarieren Sie es ohne Verwendung von var weil ich einen AJAX-Erfolgs-Callback habe, der das Ansichtsobjekt aktualisiert, das dem Controller gehört, und an diesem Punkt im Code ist meine nette kleine MVC-Welt nicht in Reichweite.

Ich untersuchte die Übergabe des View-Objekts als Parameter an die Funktion, die den AJAX-Code enthält, aber das wurde sehr unübersichtlich und hätte zu einigen schrecklichen Verstößen gegen das MVC-Muster geführt, z. B. zur Kopplung von Modell und View. Das war entsetzlich.

Dinge wie das Speichern meiner Controller-Instanz direkt auf Window als schlechtes Benehmen? Für mich riecht das ein bisschen nach der Verwendung einer globalen Variablen, aber ich sehe keinen Weg, das zu umgehen.

13voto

levik Punkte 108445

Das Festlegen von Eigenschaften des Fensterobjekts ist gleichbedeutend mit der Erstellung globaler Variablen. Das heißt, manchmal ist es unvermeidlich, aber Sie sollten versuchen, es auf ein Minimum zu beschränken, da es den globalen Namensraum verschmutzt.

In Ihrem Fall ist die Erstellung einer einzelnen Eigenschaft nicht so schlimm. Wenn Sie besonders vorsichtig sein wollen, können Sie explizit einen Namespace für alle Dinge erstellen, auf die Sie globalen Zugriff benötigen:

// In init:
var mynamespace = {};

. . .

// Once the controller is available:
var namespace = window.mynamespace;
namespace.controller = controller;
namespace.foo = bar; // Set other stuff here as well.

3voto

hvgotcodes Punkte 114342

Ich würde sagen, das ist eine schlechte Praxis. Sie können immer, und leicht, erstellen Sie einen Namensraum für Ihre Anwendung und setzen Globals in dort, wenn Sie müssen.

2voto

letronje Punkte 8683

Sie sind nützlich, wenn Sie eine globale Funktion aufrufen wollen, deren Name vorher nicht bekannt ist.

var funcName = "updateAns" + ansNum;
window[funcName]();

Sie können verwendet werden, um a) in den meisten Fällen schlechte Bewertungen zu vermeiden. b) Referenzfehler auf globale Variablen zu vermeiden.

x = x + 1 erzeugt einen Referenzfehler, wenn ein globales x nicht definiert ist. window.x = window.x + 1 wird nicht

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X