Das echte SELFHTML-Wiki gibt es unter https://wiki.selfhtml.org.
JavaScript/strict mode
In JavaScript gibt es aufgrund der bewegten Geschichte mit vielen proprietären Methoden und der sehr einfachen Möglichkeit, globale Variablen einzuführen, viele potentielle Fehlerquellen. Deshalb wurde mit ECMA5 der Strenge Modus (strict mode) eingeführt, der ein standardisiertes, um Fehlerquellen bereinigtes, Subset der Programmiersprache aktiviert.
Details: caniuse.com
Inhaltsverzeichnis
Aktivierung des strict mode
'use strict';
x = 42; //
Wenn Sie nicht komplette Programme in den Strengen Modus versetzen wollen, können Sie ihn nur auf einzelne Funktionen beschränken:
x = 42;
// Zuweisung wird zu einer globalen Variable
function zuweisungName(){
'use strict';
var name = "Arthur Dent";
} //Zuweisung innerhalb einer Funktion im Strict Mode
function zuweisungName2(){
var name = "Zaphod Beeblebrox";
} //Zuweisung innerhalb einer Funktion, aber kein Strict Mode
Auswirkungen des strict mode
Variablen müssen deklariert werden
Zuweisungen ohne var werden in JavaScript (wie im oberen Codebeispiel) zu globalen Variablen. Auch ein reiner Tippfehler führt zu einer neuen globalen Variable:
var variableX = 42;
// Zuweisung als globale Variable
function zuweisungZahl(){
varaibleX = prompt("Geben Sie eine neue Zahl ein", "");
}
variableX wird der Wert nicht überschrieben, sondern eine neue globale Variable angelegt.
Im 'strict mode' würde es einen 'reference error' anzeigen.Globale Variablen können später unerwünschte Konsequenzen auslösen. Sie können in anderen Funktionen alte Werte übergeben oder überschrieben werden. Da diese Rechenfehler keine Syntaxfehler sind, kann man sie nur sehr schwer debuggen.
Fehler werden sichtbar
JavaScript war als anfängerfreundliche Sprache konzipiert, die bei Fehlern nicht sofort abbrechen sollte. So werden bei einigen Programmierfehlern (mistakes) die Fehlermeldungen unterdrückt. Während dies manchmal einen Abbruch des Programms verhindert, entstehen teilsweise schwerwiegendere Fehler (error), die erst später sichtbar werden, wenn das Programm unerwartet abbricht. Zu diesem Zeitpunkt ist dann oft nicht mehr ersichtlich, welcher mistake ursprünglich verantwortlich war.
Im strict mode werden Meldungen für diese Fehler in der Konsole ausgegeben. So können Sie diese Fehler während des Entwickelns und Debuggens identifizieren, analysieren und beseitigen.
arguments
Beim Aufruf einer Funktion wird ein spezielles Objekt arguments erzeugt, das die Argumente der Funktion wie in einem array speichert.
function foo() {
bar(1, 2);
}
function bar(arg1, arg2) {
var temp = arguments[0];
arguments[0] = arg2;
arguments[1] = temp;
alert(arg1 + " " + arg2);
}
arguments[0] und arg1 sowie arguments[1] und arg2 die gleichen Werte. Normalerweise wird bei der Änderung eines Werts der andere ebenfalls verändert. In der Funktion bar werden die Werte von arg1 und arg2 getauscht, obwohl nur die Werte des arguments-Array verändert wurden.Im strikten Modus ist dies nicht erlaubt; die Werte von
arg1 und arg2 bleiben unverändert.Das arguments-Objekt enthält auch einen Zeiger auf die gerade ausgeführte Funktion. Mit arguments.callee können Sie die Funktion referenzieren. Dies ist innerhalb von anonymen Funktionen sinnvoll, bei anderen Funktionen können Sie die Funktion mit ihrem Namen aufrufen.
Im strikten Modus ist der Aufruf von arguments.caller und arguments.callee nicht erlaubt.
Funktionsaufrufe
In JavaScript können Sie auch innerhalb von Anweisungen Funktionsdeklarationen notieren. Sie werden unabhängig davon, wo sie im Quelltext stehen, gleich zu Beginn geparst und interpretiert. Das kann in manchen Fällen zu unerwartetem Verhalten führen.
if (true) {
function foo () {
return 'first';
}
} else {
function foo () {
return 'second';
}
}
foo(); // Manche Javascript-Engines führen die erste Funktion aus, manche die zweite.
Im strikten Modus ist dies nicht erlaubt. Um dennoch Funktion haben zu können, die von Bedingungen abhängig sind, müssen Sie sie als Funktionsausdruck erstellen und einer Variable zuweisen:
'use strict';
var foo;
if (true) {
foo = function () {
return 'first';
};
} else {
foo = function () {
return 'second';
};
}
foo(); // Jede Javascript-Engine führt die erste Funktion aus.
this
Wenn man innerhalb eines Funktionsaufrufs neue Methoden und Eigenschaften für this definiert, sind diese globale Variablen.
Im strict mode ist this undefined. So müssen deshalb neue Eigenschaften und Methoden immer mit new eingeleitet werden.
with
Mit dem with-Statement können Sie mehrere Anweisungen in Folge notieren, die alle mit dem gleichen Objekt arbeiten.
Allerdings kann dies schwere Nebenwirkungen haben. Deshalb ist das with-Statement im strict mode verboten und erzeugt einen Syntaxfehler.[1]
Empfehlungen für die Praxis
'use strict';!
'use strict'; führt dazu, dass Programmierer ...
- Fehler beim Entwickeln früher erkennen
- Scripts leichter debuggen können
- sich mehr Gedanken um den Geltungsbereich von Variablen machen
- letztendlich eine bessere Strukturierung und Kapselung der Scripts erreichen
Dieser Zwang zu mehr Disziplin ist insbesondere dann wichtig, wenn Code aus der Hand gegeben oder in Teamarbeit entwickelt wird.
Peter Kroener empfiehlt,'use strict'; beim Entwickeln zu verwenden und dann zu entfernen, um ältere Browser (und künftige Bugs) zu berücksichtigen. Allerdings setzt dies voraus, in der Programmierung auf Methoden, die im strengen Modus anders arbeiten, zu verzichten.[2]
Weblinks
- ↑ yuiblog.com: With statement considered harmful
- ↑ Peter Kröner: Der Strict mode
- Peter Kröner: Der Strict mode
- mediaevent: Strict mode
- MSDN: Strict Mode
- MDN: Strict mode
Durch die Deklaration von
'use strict';wissen die Browser, dass sie einen strengeren Maßstab anlegen müssen und geben einen Fehler (Reference Error) zurück, da die Variable nicht deklariert ist. Ältere Browser sehen in'use strict';nur einen reinen String, den sie ignorieren.'use strict';! Deklarieren Sie globale Variablen am Anfang des Scripts mitvar!