8494 Stimmen

Was bedeutet "use strict" in JavaScript, und was ist der Grund dafür?

Kürzlich habe ich einen Teil meines JavaScript-Codes durch Crockfords JSLint und es wurde folgende Fehlermeldung ausgegeben:

Problem in Zeile 1 Zeichen 1: Fehlende "use strict"-Anweisung.

Bei meinen Recherchen habe ich festgestellt, dass manche Leute "use strict"; in ihren JavaScript-Code zu integrieren. Nachdem ich die Anweisung hinzugefügt hatte, trat der Fehler nicht mehr auf. Leider hat Google nicht viel über die Geschichte hinter dieser String-Anweisung verraten. Sicherlich muss es etwas damit zu tun haben, wie das JavaScript vom Browser interpretiert wird, aber ich habe keine Ahnung, welche Auswirkungen das haben könnte.

Was ist also "use strict"; worum geht es dabei, was bedeutet es, und ist es noch relevant?

Reagiert einer der aktuellen Browser auf die "use strict"; Zeichenfolge oder ist sie für die künftige Verwendung bestimmt?

73 Stimmen

Die Antworten hier sind alt, aber sie sind falsch. Der Hauptgrund für den Strict-Modus war nicht, um Programmierfehler zu verhindern - es war, JavaScript lexikalisch skaliert zu machen, so dass es statisch analysierbar sein könnte :]

5 Stimmen

Und der Grund für die seltsame Syntax (magische Zeichenkette als Anweisung) ist die Abwärtskompatibilität mit älteren JavaScript-Engines. Die Idee des strengen Modus ist es, einige problematische JavaScript-Sprachkonstrukte zu verbieten, aber die Interpretation des Codes nicht zu ändern, so dass die Ausführung identisch ist, unabhängig davon, ob die JavaScript-Engine den strengen Modus tatsächlich unterstützt oder nicht.

264voto

sampathsris Punkte 20368

Verwendung von 'use strict'; macht Ihren Code nicht plötzlich besser.

Le site JavaScript Strict-Modus ist ein Merkmal in ECMAScript 5 . Sie können den Strict-Modus aktivieren, indem Sie dies am Anfang Ihres Skripts/ihrer Funktion deklarieren.

'use strict';

Wenn eine JavaScript-Engine dies sieht Richtlinie wird er den Code in einem speziellen Modus interpretieren. In diesem Modus werden Fehler angezeigt, wenn bestimmte Codierungspraktiken entdeckt werden, die sich als potenzielle Fehler herausstellen könnten (dies ist der Grund für den strengen Modus).

Betrachten Sie dieses Beispiel:

var a = 365;
var b = 030;

In seiner Besessenheit, die numerischen Literale aneinanderzureihen, hat der Entwickler versehentlich die Variable b mit einem oktalen Literal. Der nicht-strikte Modus interpretiert dies als numerisches Literal mit dem Wert 24 (zur Basis 10). Im Strict-Modus wird jedoch ein Fehler ausgegeben.

Eine nicht erschöpfende Liste von Spezialitäten im strengen Modus finden Sie unter diese Antwort .


Wo sollte ich verwenden 'use strict'; ?

  • In meinem neu JavaScript-Anwendung: Ganz genau! Der strikte Modus kann als Whistleblower verwendet werden, wenn Sie etwas Dummes mit Ihrem Code anstellen.

  • In meinem bestehende JavaScript-Code: Wahrscheinlich nicht! Wenn Ihr vorhandener JavaScript-Code Anweisungen enthält, die im Strict-Mode verboten sind, bricht die Anwendung einfach ab. Wenn Sie den Strict-Modus verwenden wollen, sollten Sie darauf vorbereitet sein, Ihren bestehenden Code zu debuggen und zu korrigieren. Aus diesem Grund mit 'use strict'; macht Ihren Code nicht plötzlich besser .


Wie verwende ich den strengen Modus?

  1. Einfügen einer 'use strict'; Anweisung am Anfang Ihres Skripts:

     // File: myscript.js
    
     'use strict';
     var a = 2;
     ....

    Beachten Sie, dass alles in der Datei myscript.js wird im strengen Modus interpretiert.

  2. Oder, fügen Sie eine 'use strict'; Anweisung am Anfang Ihres Funktionskörpers:

     function doSomething() {
         'use strict';
         ...
     }

    Alles im lexikalische Reichweite der Funktion doSomething wird im strengen Modus interpretiert. Das Wort lexikalische Reichweite ist hier wichtig. Zum Beispiel, wenn Ihr Streng Code ruft eine Funktion einer Bibliothek auf, die nicht streng wird nur Ihr Code im strikten Modus ausgeführt, nicht aber die aufgerufene Funktion. Siehe diese Antwort für eine bessere Erklärung.


Welche Dinge sind im strengen Modus verboten?

Ich habe eine schöner Artikel beschreibt einige Dinge, die im strengen Modus verboten sind (beachten Sie, dass dies keine vollständige Liste ist):

Umfang

Historisch gesehen war JavaScript verwirrt darüber, wie Funktionen skaliert werden. Manchmal scheinen sie statisch skaliert zu sein, aber einige Funktionen verhalten sie sich, als wären sie dynamisch skaliert. Dies ist verwirrend und macht Programme schwierig zu lesen und zu verstehen. Missverständnisse führen zu Fehlern. Es ist auch ein Problem für die Leistung. Statisches Scoping würde die Bindung von Variablen zur Kompilierzeit ermöglichen. Kompilierzeit, aber die Anforderung des dynamischen Scopings bedeutet, dass die Bindung auf die Laufzeit verschoben werden, was mit erheblichen Leistungseinbußen Einbußen mit sich bringt.

Der strikte Modus erfordert, dass alle Variablenbindungen statisch erfolgen. Das bedeutet, dass die Funktionen, die bisher eine dynamische Bindung erfordern, beseitigt oder geändert werden müssen. Konkret heißt die with-Anweisung eliminiert, und die Fähigkeit der eval-Funktion, die Umgebung Umgebung ihres Aufrufers zu manipulieren, ist stark eingeschränkt.

Einer der Vorteile von striktem Code ist, dass Werkzeuge wie YUI-Kompressor eine bessere Arbeit bei der Verarbeitung leisten kann.

Implizite globale Variablen

JavaScript verfügt über implizite globale Variablen. Wenn Sie eine Variable nicht explizit deklarieren, wird eine globale Variable implizit für Sie deklariert. Das macht das Programmieren einfacher für Anfängern die Programmierung, da sie einige ihrer grundlegenden Hausarbeiten vernachlässigen Aufgaben vernachlässigen. Aber es macht die Verwaltung größerer Programme viel schwieriger schwieriger und die Zuverlässigkeit sinkt erheblich. Deshalb werden im strikten Modus werden keine impliziten globalen Variablen mehr erstellt. Sie sollten alle Ihre Variablen explizit deklarieren.

Globale Leckage

Es gibt eine Reihe von Situationen, die dazu führen können this die an das globale Objekt gebunden werden soll. Wenn Sie zum Beispiel vergessen die new Präfix beim Aufruf einer Konstruktorfunktion, das Konstruktor's this wird unerwartet an das globale Objekt gebunden, so dass anstatt ein neues Objekt zu initialisieren, wird es stattdessen globale Variablen manipuliert. In diesen Situationen bindet der Strict-Modus stattdessen binden this a undefined was dazu führt, dass der Konstruktor stattdessen eine Ausnahme auslöst, wodurch der Fehler viel früher erkannt wird.

Geräuschvolles Scheitern

JavaScript hat schon immer schreibgeschützte Eigenschaften gehabt, aber Sie konnte sie nicht selbst erstellen, bis ES5 die Object.createProperty Funktion hat diese Fähigkeit offengelegt. Wenn Sie versuchten, einer schreibgeschützten Eigenschaft einen Wert zuzuweisen einer schreibgeschützten Eigenschaft zuzuweisen, würde dies stillschweigend fehlschlagen. Die Zuweisung würde den Wert der Eigenschaft nicht ändern, aber Ihr Programm würde so fortfahren als ob es das getan hätte. Dies ist ein Integritätsrisiko, das dazu führen kann, dass Programme in einen inkonsistenten Zustand geraten. Im Strict-Modus führt der Versuch, eine schreibgeschützte Eigenschaft zu ändern, wird eine Ausnahme ausgelöst.

Oktal

Die oktale (oder Basis 8) Darstellung von Zahlen war extrem bei der Programmierung auf Maschinenebene auf Maschinen, deren Wortgrößen ein Vielfaches von 3 waren. ein Vielfaches von 3 waren. Man brauchte oktal, wenn man mit dem CDC 6600 Mainframe, der eine Wortgröße von 60 Bit hatte. Wenn Sie lesen konnten oktal lesen konnte, konnte man ein Wort als 20 Ziffern betrachten. Zwei Ziffern standen für den Operationscode, und eine Ziffer bezeichnete eines von 8 Registern. Während des langsamen Übergang von Maschinencodes zu Hochsprachen wurde es für wurde es als nützlich erachtet, in Programmiersprachen oktale Formen zu verwenden.

In C war eine äußerst unglückliche Darstellung der Oktalzahl gewählt: Führende Null. Also in C, 0100 bedeutet 64, nicht 100, und 08 ist eine Fehler, nicht 8. Noch bedauerlicher ist, dass dieser Anachronismus in fast alle modernen Sprachen übernommen, einschließlich JavaScript, wo nur dazu verwendet wird, Fehler zu erzeugen. Er hat keinen anderen Zweck. Also im strict mode sind oktale Formen nicht mehr erlaubt.

Et cetera

Die Argumente Pseudo-Array wird ein wenig mehr Array-ähnlich in ES5. Im Strict-Modus verliert es seine callee y caller Eigenschaften. Dies ermöglicht es, Ihre arguments zu nicht vertrauenswürdigen Code, ohne viel vertraulichen Kontext preiszugeben. Auch die arguments Eigenschaft von Funktionen wird eliminiert.

Im strengen Modus führen doppelte Schlüssel in einem Funktionsliteral zu einer Syntaxfehler. Eine Funktion kann nicht zwei Parameter mit demselben Namen haben. Eine Funktion kann keine Variable mit demselben Namen haben wie einer ihrer Parameter haben. Eine Funktion kann nicht delete seine eigenen Variablen. Ein Versuch, die delete eine nicht konfigurierbare Eigenschaft löst jetzt eine Ausnahme aus. Primitive Werte werden nicht implizit umbrochen.


Reservierte Wörter für zukünftige JavaScript-Versionen

ECMAScript 5 fügt eine Liste von reservierten Wörtern hinzu. Wenn Sie diese als Variablen oder Argumente verwenden, wird im Strict-Modus ein Fehler ausgegeben. Die reservierten Wörter sind:

implements , interface , let , package , private , protected , public , static y yield


Weitere Lektüre

170voto

Pank Punkte 12942

Ich empfehle jedem Entwickler dringend, jetzt mit dem Strict-Modus zu beginnen. Es gibt genügend Browser, die ihn unterstützen, so dass der Strict-Modus uns tatsächlich vor Fehlern bewahren wird, von denen wir nicht einmal wussten, dass sie in Ihrem Code enthalten sind.

Offensichtlich werden in der Anfangsphase Fehler auftreten, auf die wir noch nie gestoßen sind. Um den vollen Nutzen daraus zu ziehen, müssen wir nach der Umstellung auf den Strict-Modus gründlich testen, um sicherzustellen, dass wir alles abgefangen haben. Auf jeden Fall werfen wir nicht einfach use strict in unserem Code und gehen davon aus, dass es keine Fehler gibt. Es ist also an der Zeit, diese unglaublich nützliche Sprachfunktion zu nutzen, um besseren Code zu schreiben.

Zum Beispiel,

var person = {
    name : 'xyz',
    position : 'abc',
    fullname : function () {  "use strict"; return this.name; }
};

JSLint ist ein Debugger, der von Douglas Crockford geschrieben wurde. Fügen Sie einfach Ihr Skript ein, und es wird schnell nach auffälligen Problemen und Fehlern in Ihrem Code gesucht.

118voto

Ely Punkte 10427

Ich möchte eine etwas fundiertere Antwort geben, die die anderen Antworten ergänzt. Ich hatte gehofft, die beliebteste Antwort bearbeiten zu können, aber das ist mir nicht gelungen. Ich habe versucht, sie so umfassend und vollständig wie möglich zu gestalten.

Sie können sich auf die MDN-Dokumentation für weitere Informationen.

"use strict" eine in ECMAScript 5 eingeführte Richtlinie.

Richtlinien sind ähnlich wie Anweisungen und doch anders.

  • use strict enthält keine Schlüsselwörter: Die Richtlinie ist eine einfache Ausdrucksanweisung, die aus einem speziellen String-Literal (in einfachen oder doppelten Anführungszeichen) besteht. JavaScript-Engines, die ECMAScript 5 nicht implementieren, sehen lediglich eine Ausdrucksanweisung ohne Seiteneffekte. Es ist zu erwarten, dass künftige Versionen der ECMAScript-Standards Folgendes einführen use als echtes Schlüsselwort zu verwenden; die Anführungszeichen würden dadurch hinfällig werden.
  • use strict kann nur am Anfang eines Skripts oder einer Funktion verwendet werden, d.h. es muss vor jeder anderen (echten) Anweisung stehen. Sie muss nicht die erste Anweisung in einem Skript oder einer Funktion sein: ihr können andere Anweisungsausdrücke vorausgehen, die aus String-Literalen bestehen (und JavaScript-Implementierungen können sie als implementierungsspezifische Direktiven behandeln). Stringliterale Anweisungen, die auf eine erste echte Anweisung (in einem Skript oder einer Funktion) folgen, sind einfache Ausdrucksanweisungen. Sie dürfen von Interpretern nicht als Direktiven interpretiert werden und haben keine Wirkung.

Le site use strict zeigt an, dass der folgende Code (in einem Skript oder einer Funktion) strikter Code ist. Der Code in der höchsten Ebene eines Skripts (Code, der nicht in einer Funktion ist) wird als strikter Code betrachtet, wenn das Skript eine use strict Richtlinie. Der Inhalt einer Funktion gilt als strikter Code, wenn die Funktion selbst in einem strikten Code definiert ist oder wenn die Funktion eine use strict Richtlinie. Code, der an eine eval() Methode wird als strikter Code betrachtet, wenn eval() aus einem strikten Code aufgerufen wurde oder die use strict Richtlinie selbst.

Der Strict Mode von ECMAScript 5 ist eine eingeschränkte Untermenge der JavaScript-Sprache, die relevante Defizite der Sprache beseitigt und eine strengere Fehlerprüfung und höhere Sicherheit bietet. Im Folgenden werden die Unterschiede zwischen dem Strict Mode und dem Normal Mode aufgeführt (wobei die ersten drei besonders wichtig sind):

  • Sie können die with -Anweisung im strengen Modus.
  • Im strengen Modus müssen alle Variablen deklariert werden: Wenn Sie einem Bezeichner einen Wert zuweisen, der nicht als Variable, Funktion, Funktionsparameter, Catch-Clause-Parameter oder Eigenschaft der globalen Object dann erhalten Sie eine ReferenceError . Im normalen Modus wird der Bezeichner implizit als globale Variable deklariert (als eine Eigenschaft der globalen Object )
  • Im strengen Modus wird das Schlüsselwort this hat den Wert undefined in Funktionen, die als Funktionen (nicht als Methoden) aufgerufen wurden. (Im normalen Modus this zeigt immer auf den globalen Object ). Dieser Unterschied kann verwendet werden, um zu prüfen, ob eine Implementierung den strengen Modus unterstützt:
var hasStrictMode = (function() { "use strict"; return this===undefined }());
  • Auch wenn eine Funktion aufgerufen wird mit call() o apply im strengen Modus, dann this ist genau der Wert des ersten Arguments des Befehls call() o apply() Aufforderung. (Im normalen Modus null y undefined werden durch den globalen Object und Werte, die keine Objekte sind, werden in Objekte umgewandelt).

  • Im strengen Modus erhalten Sie eine TypeError wenn Sie versuchen, schreibgeschützte Eigenschaften zuzuweisen oder neue Eigenschaften für ein nicht erweiterbares Objekt zu definieren. (Im normalen Modus schlägt beides einfach ohne Fehlermeldung fehl).

  • Im strengen Modus wird bei der Übergabe von Code an eval() können Sie keine Variablen oder Funktionen im Bereich des Aufrufers deklarieren oder definieren (wie Sie es im normalen Modus tun können). Stattdessen wird ein neuer Bereich für eval() und die Variablen und Funktionen liegen innerhalb dieses Bereichs. Dieser Bereich wird zerstört, nachdem eval() beendet die Ausführung.

  • Im Strict-Modus enthält das Argumente-Objekt einer Funktion eine statische Kopie der Werte, die an diese Funktion übergeben werden. Im normalen Modus hat das arguments-Objekt ein etwas "magisches" Verhalten: Die Elemente des Arrays und die benannten Funktionsparameter verweisen beide auf denselben Wert.

  • Im strengen Modus erhalten Sie eine SyntaxError wenn die delete Operator von einem nicht qualifizierten Bezeichner (einer Variablen, einer Funktion oder einem Funktionsparameter) gefolgt wird. Im normalen Modus wird der delete Ausdruck würde nichts bewirken und wird ausgewertet als false .

  • Im strengen Modus erhalten Sie eine TypeError wenn Sie versuchen, eine nicht konfigurierbare Eigenschaft zu löschen. (Im normalen Modus schlägt der Versuch einfach fehl und die delete Ausdruck wird ausgewertet als false ).

  • Im strikten Modus wird es als syntaktischer Fehler angesehen, wenn Sie versuchen, mehrere Eigenschaften mit demselben Namen für ein Objektliteral zu definieren. (Im normalen Modus tritt kein Fehler auf.)

  • Im Strict-Modus gilt es als syntaktischer Fehler, wenn eine Funktionsdeklaration mehrere Parameter mit demselben Namen hat. (Im normalen Modus tritt kein Fehler auf.)

  • Im strengen Modus sind oktale Literale nicht erlaubt (das sind Literale, die mit 0x . (Im normalen Modus erlauben einige Implementierungen oktale Literale).

  • Im strikten Modus werden die Bezeichner eval y arguments werden wie Schlüsselwörter behandelt. Sie können ihren Wert nicht ändern, ihnen keinen Wert zuweisen und sie nicht als Namen für Variablen, Funktionen, Funktionsparameter oder Bezeichner eines Catch-Blocks verwenden.

  • Im Strict-Modus sind die Möglichkeiten zur Untersuchung des Aufrufstapels stärker eingeschränkt. arguments.caller y arguments.callee verursachen TypeError in einer Funktion im Strict-Modus. Außerdem verursachen einige Aufrufer- und Argumenteigenschaften von Funktionen im strikten Modus eine TypeError wenn Sie versuchen, sie zu lesen.

7 Stimmen

"Im strikten Modus sind oktale Literale nicht erlaubt (das sind Literale, die mit 0x ... beginnen)" oktale Literale beginnen mit einem führenden 0 .

104voto

Shubh Punkte 6487

Meine Meinung dazu:

Eines der Ziele des Strict-Modus ist es, eine schnellere Fehlersuche bei Problemen zu ermöglichen. Er hilft den Entwicklern, indem er Ausnahmen auslöst, wenn bestimmte falsche Dinge auftreten, die ein stilles und seltsames Verhalten Ihrer Webseite verursachen können. In dem Moment, in dem wir den use strict wird der Code Fehler ausgeben, die dem Entwickler helfen, sie im Voraus zu beheben.

Einige wichtige Dinge, die ich gelernt habe, nachdem ich use strict :

Verhindert die Deklaration von globalen Variablen:

var tree1Data = { name: 'Banana Tree',age: 100,leafCount: 100000};

function Tree(typeOfTree) {
    var age;
    var leafCount;

    age = typeOfTree.age;
    leafCount = typeOfTree.leafCount;
    nameoftree = typeOfTree.name;
};

var tree1 = new Tree(tree1Data);
console.log(window);

Dieser Code erzeugt nun nameoftree im globalen Geltungsbereich, auf die man mit window.nameoftree . Wenn wir implementieren use strict würde der Code einen Fehler auslösen.

Ungefangener ReferenceError: nameoftree ist nicht definiert

Sample

Beseitigt with Erklärung :

with Anweisungen können nicht mit Tools wie uglify-js . Sie sind auch Abgelehnt und aus zukünftigen JavaScript-Versionen entfernt.

Sample

Verhindert Duplikate :

Wenn wir eine doppelte Eigenschaft haben, kommt es zu einer Ausnahme

Ungefangener SyntaxFehler: Doppelte Dateneigenschaft in Objektliteral nicht im Strict-Modus nicht erlaubt

"use strict";
var tree1Data = {
    name: 'Banana Tree',
    age: 100,
    leafCount: 100000,
    name:'Banana Tree'
};

Es gibt noch ein paar mehr, aber da muss ich mir noch mehr Wissen aneignen.

79voto

Stephen Punkte 805

Wenn Sie einen Browser verwenden, der im letzten Jahr oder so veröffentlicht wurde, unterstützt er höchstwahrscheinlich den JavaScript-Strict-Modus. Nur ältere Browser, die es gab, bevor ECMAScript 5 zum aktuellen Standard wurde, unterstützen ihn nicht.

Die Anführungszeichen um den Befehl stellen sicher, dass der Code auch in älteren Browsern funktioniert (obwohl die Dinge, die im Strict-Modus einen Syntaxfehler erzeugen, in der Regel nur dazu führen, dass das Skript in diesen älteren Browsern auf eine schwer zu erkennende Weise nicht funktioniert).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X