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[Bearbeiten]
'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[Bearbeiten]
Variablen müssen deklariert werden[Bearbeiten]
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(){
variabelX = 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'
geben.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[Bearbeiten]
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 teilweise 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[Bearbeiten]
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[Bearbeiten]
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[Bearbeiten]
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[Bearbeiten]
Mit dem with-Statement konnten Sie mehrere Anweisungen in Folge notieren, die alle mit dem gleichen Objekt arbeiten.
with (document) {
open();
write("<p>Diese Seite hat den Titel " + title + "<\/p>");
close();
}
Da normalerweise mehrere Anweisungen folgen, die dieses Objekt verwenden, müssen Sie alle diese Anweisungen in geschweifte Klammern einschließen.
Achtung!
Im strict mode ist das with-Statement verboten und erzeugt einen Syntaxfehler![1]
Empfehlungen für die Praxis[Bearbeiten]
Verwenden Sie '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[Bearbeiten]
- ↑ 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.Verwenden Sie immer den Strengen Modus mit
Deklarieren Sie globale Variablen am Anfang des Scripts mit'use strict';
!var
oderconst
(wenn sie sich nicht mehr verändert)!