JavaScript/Tutorials/strict mode

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

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.

  • Chrome
  • Firefox
  • IE 10
  • Opera
  • Safari

Details: caniuse.com

Inhaltsverzeichnis

[Bearbeiten] Aktivierung des strict mode

Beispiel: Wie aktiviere ich den strict mode?
'use strict';
x = 42; //
Normalerweise würde aus dieser Zuweisung eine globale Variable entstehen, die dann in anderen Teilen des Programms zu unerwünschten Konsequenzen führen kann.

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.

Empfehlung:

Verwenden Sie immer den Strengen Modus mit 'use strict';!

Deklarieren Sie globale Variablen am Anfang des Scripts mit var!

Wenn Sie nicht komplette Programme in den Strengen Modus versetzen wollen, können Sie ihn nur auf einzelne Funktionen beschränken:

Beispiel: Wie aktiviere ich den strict mode?
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

[Bearbeiten] Auswirkungen des strict mode

[Bearbeiten] 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:

Beispiel: globale Variable durch Tippfehler
 var variableX = 42;                             
       // Zuweisung als globale Variable
 
function zuweisungZahl(){
    varaibleX = prompt("Geben Sie eine neue Zahl ein", "");      
}
Durch die falsche Schreibweise von 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.


[Bearbeiten] 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.


[Bearbeiten] arguments

Beim Aufruf einer Funktion wird ein spezielles Objekt arguments erzeugt, das die Argumente der Funktion wie in einem array speichert.

Beispiel: Arguments
function foo() {
  bar(1, 2);
}
 
function bar(arg1, arg2) {
  var temp = arguments[0];
  arguments[0] = arg2;
  arguments[1] = temp;
  alert(arg1 + " " + arg2);
}
In diesem Beispiel haben 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.

[Bearbeiten] 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.

Beispiel
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:

Beispiel
'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.


[Bearbeiten] 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.

[Bearbeiten] 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]

[Bearbeiten] Empfehlungen für die Praxis

Empfehlung:

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]


[Bearbeiten] Weblinks

  1. yuiblog.com: With statement considered harmful
  2. Peter Kröner: Der Strict mode


Meine Werkzeuge
Namensräume

Varianten
Aktionen
Übersicht
Index
Mitmachen
Werkzeuge
Spenden
SELFHTML