Rolf B: Was zum Geier hab ich da aufgeführt? Javascript Objekte und andere Irrsinnigkeiten...

Beitrag lesen

Hallo Daniel,

Bin für bessere Ideen aber jederzeit offen!

Für bessere Ideen müsste man mehr über dein Gesamtkunstwerk wissen.

Wenn Du Eventhandler mit onclick oder onsonstwas definierst, wirst Du kaum eine Chance haben. Denn die brauchen globale Funktionen und die müssen dann globale Objekte verwenden.

Aber wenn Du ordentlich mit unobtrusive Script arbeitest, d.h. deine Eventhandler mit addEventListener registrierst, kannst Du Modularisierung mit Hilfe einer IIFE betreiben. Oder Du stellst das Ganze in ein <script type="module">...</script> Element (ECMAScript-Modul, nicht im Internet Explorer verfügbar) und brauchst Dir keine Gedanken um globalen Müll zu machen, denn globale Variablen eines Moduls bleiben im Modul. Zu IIFEs haben wir Artikel im Wiki, zu ECMAScript-Modulen nicht. Dafür hatte ich bisher keine Zeit. Aber das Wilde Weite Web hat viele Infos dazu.

Das Problem mit dem Hardcoding kannst Du nur über Objekte lösen, denn eine Übergabe per Referenz kennt JavaScript nicht. Aber ein Objekt hast Du ja nun.

D.h. wenn Du GLOBAL_VAR.foo.bar.i inkrementieren willst, könntest Du eine Funktion "erhöhe" schreiben, die so aussieht:

function verändere(obj, eigenschaft, wert) {
   obj[eigenschaft] = obj[eigenschaft] + wert;
}

// Inkrementieren von i mit
verändere(GLOBAL_VAR.foo.bar, "i", +1);
// Dekrementieren von i mit
verändere(GLOBAL_VAR.foo.bar, "i", -1);

Aber schick ist das nicht wirklich.

Du könntest es auch so machen, dass Du ein Zählerobjekt mit Methoden erstellst. Das folgende ist "modernes" JavaScript; wenn Du auch den Internet Explorer unterstützen willst, musst Du auf die alte Syntax mit Konstruktorfunktion und Prototyp zurückfallen.

// Einmalig an geeigneter Stelle
class Counter {
   constructor(startwert) {
      this.value = startwert;
   }
   increment() { this.value++; }
   decrement() { this.value--; }
}

// Verwendung
GLOBAL_VAR.foo.bar.zähler = new Counter(0);
GLOBAL_VAR.foo.bar.zähler.increment();         // Direkt inkrementieren
console.log(GLOBAL_VAR.foo.bar.zähler.value);  // 1
erhöhe(GLOBAL_VAR.foo.bar.zähler);             // Aufgabe delegieren
console.log(GLOBAL_VAR.foo.bar.zähler.value);  // 2

function erhöhe(z) {
   z.increment();
}

Rolf

--
sumpsi - posui - obstruxi