1unitedpower: Werte aus JSON weiterverwerten

Beitrag lesen

Da machst n globales Object und gut isses.

Ich bin JS-Newbie. Kannst Du mir das etwas genauer erklären bitte?

Variablen in JavaScript unterliegen ihrem jeweiligen Gültigkeitsbereich, nur dort kann auf sie zugegriffen werden. Ein Gültigkeitsbereich wird durch eine Funktion gekapselt:

function doSomething () {
   var foo = 42;
   // Hier ist foo gültig, man nennt foo auch eine lokale Variable
}
// Hier ist foo undefiniert

Gültigkeitsbereiche können verschachtelt werden, die innere Funktion erhält dann Zugriff auf die Variablen der äußeren, aber nicht umgekehrt:

function doSomething () {
   var foo = 42;
   function bar () {
      var baz = foo + 3; // Innerhalb dieser Funktion kann auf baz und foo zugegriffen werden
   }
   // baz ist hier undefiniert
}
// foo und baz sind hier undefiniert

Nun kann es vorkommen, dass man eine Variable mit mehreren Funktionen teilen möchte, man definiert die Variable dann in einem gemeinsamen übergordneten Gültigkeitsbereich:

function doSomething () {
   var foo = 42; // Sowohl bar als auch baz haben Zugriff auf foo
   function bar () {
      console.log(foo);
   }
   function baz () {
      console.log(foo);
   }
}

Es ist eine gute Faustregel beim Teilen von Variablen immer den kleinsten gemeinsamen Gültigkeitsbereich zu wählen. Anfänger fällt es häufig schwierig diesen Bereich zu finden, deshalb tendieren sie dazu, den globalen Bereich dafür zu missbrauchen. Im globalen Gültigkeitsbereich landen alle Variablen, die nicht innerhalb einer Funktion definiert wurden. Das ist problematisch, weil dann auch Funktionen Zugriff auf die geteilten Variablen erhalten, die sie gar nicht sehen sollten. Das führt über kurz oder lang zu unvorhergesehen Nebenwirkungen und Kollisionen - Fehler, die schwer zu entdecken und zu beheben sind. Selbst der JavaScript-Erfinder Brendan Eich hat den globalen Gültigkeitsbereich schon als eine seiner größten Fehlentscheidungen bedauert.

// Schlecht, da foo global ist
var foo = 42;
function doSomething () {
   function bar () {
      console.log(foo);
   }
   function baz () {
      console.log(foo);
   }
}

PS: Ich habe hier den lexikalischen Gültigkeitsbereich erklärt, daneben besitzt JavaScript auch einen dynamischen Gültigkeitsbereich, der aber ungleich komplizierter ist und besser gemieden wird. Die Kontroverse hängt eng mit this-Schlüsselwort zusammen.