Typische Probleme mit JavaScript

Hositing

  • Variablen (mit var) und Funktionen können überall definiert werden
  • Der Interpreter zieht Deklarationen an den Funktionsanfang (hoisting)
name = 'global';

function f() {
    log(name);
    var name = 'lokal';
    log(name);
}
f();
function f() {
    log(name);
    var name = 'lokal';
    log(name);
    function k() { };
}

Entspricht

function f() {
    var name;
    function k() { };
    log(name);
    name = 'lokal';
    log(name);
}

Globale Variablen

  • JavaScript kennt nur zwei Scopes
    • Funktion
    • Global
  • Man verschmutzt sehr schnell (versehentlich) den globalen Namensraum
    • Konstruktorfunktion ohne new aufrufen
    • let in einer Funktion vergessen
  • Alle nicht deklarierten Variablen werden global (implied globals)

Beispiel: Globale Variablen aus Versehen

Aufruf der Funktion legt eine globale Variable result an

function sum(x, y) {
    result = x + y;
    return result;
}
sum(5, 2);
log(result);
function foo() {
  let a = b = 5; // b ist global
}

foo();

log("b=" + b);
function Constructor() {
    this.name = "Hans";
}
let person = Constructor(); // name ist global
log(name);

Konstruktor mit new-Garantie

function Hund(name) {

  if (!(this instanceof Hund)) {
    return new Hund(name);
  }

  this.hundeName = name;
}

let emil = new Hund('Emil');
let hasso = Hund('Hasso');

log(hasso.hundeName);
log(typeof hundeName);

Empfehlung: Nur ein globales Objekt

  • Anstatt viele globale Variablen zu definieren, erzeugt man ein einziges Objekt
  • Alle globalen Variablen werden zu Properties des Objektes
let WEB = {}; // einzige globale Variable
WEB.Tier = new function(name) { this.name = name; };
WEB.add = new function(a, b) { return a + b; };
WEB.daten = 42;

Verwendung von Semikolon

  • JavaScript fügt fehlende Semikolons automatisch ein
  • Einfügung erfolgt immer am Ende der Zeile

Beispiel

function f() {
    return
    {
        name: "Thomas"
    };
}

log(f());

Copyright © 2025 Thomas Smits