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
newaufrufen letin 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());