form function Was macht "use strict" in JavaScript und was ist der Grund dafür?



12 Answers

Es ist eine neue Funktion von ECMAScript 5. John Resig hat eine schöne Zusammenfassung davon geschrieben.

Es ist nur eine Zeichenfolge, die Sie in Ihre JavaScript-Dateien einfügen (entweder oben in Ihrer Datei oder innerhalb einer Funktion). Sie sieht folgendermaßen aus:

"use strict";

Wenn Sie es jetzt in Ihren Code einfügen, sollte dies bei aktuellen Browsern keine Probleme verursachen, da es nur eine Zeichenfolge ist. Es kann in Zukunft zu Problemen mit Ihrem Code führen, wenn Ihr Code gegen das Pragma verstößt. Wenn Sie beispielsweise foo = "bar" ohne zuerst foo zu definieren, wird Ihr Code ausfallen ... was meiner Meinung nach eine gute Sache ist.

use strict es6

Vor kurzem habe ich etwas von meinem JavaScript-Code durch Crockfords JSLint und es gab den folgenden Fehler:

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

Bei einigen Recherchen wurde mir klar, dass einige Leute "use strict"; hinzufügen "use strict"; in ihren JavaScript-Code. Nachdem ich die Anweisung hinzugefügt hatte, wurde der Fehler nicht mehr angezeigt. Leider hat Google nicht viel von der Geschichte hinter dieser Zeichenfolge-Erklärung preisgegeben. Sicher muss es etwas damit zu tun haben, wie das JavaScript vom Browser interpretiert wird, aber ich habe keine Ahnung, wie der Effekt aussehen würde.

Also, was ist "use strict"; Alles, was bedeutet das und ist es noch relevant?

Reagiert einer der aktuellen Browser auf "use strict"; String oder ist es für die zukünftige Verwendung?




Wenn Sie sich Sorgen machen, ob Sie die use strict von Streng verwenden, sollten Sie diesen Artikel lesen:

Unterstützung für ECMAScript 5 'Strict Mode' in Browsern. Was bedeutet das?
NovoGeek.com - Krishnas Weblog

Es spricht von Browser-Unterstützung, aber noch wichtiger, wie man sicher damit umgeht:

function isStrictMode(){
    return !this;
} 
/*
   returns false, since 'this' refers to global object and 
   '!this' becomes false
*/

function isStrictMode(){   
    "use strict";
    return !this;
} 
/* 
   returns true, since in strict mode the keyword 'this'
   does not refer to global object, unlike traditional JS. 
   So here, 'this' is 'undefined' and '!this' becomes true.
*/



Verwenden Sie 'use strict'; macht Ihren Code nicht plötzlich besser.

Der strikte JavaScript-Modus ist eine Funktion in ECMAScript 5 . Sie können den strikten Modus aktivieren, indem Sie dies oben in Ihrem Skript / in Ihrer Funktion angeben.

'use strict';

Wenn eine JavaScript-Engine diese Anweisung erkennt , wird sie den Code in einem speziellen Modus interpretieren. In diesem Modus werden Fehler ausgelöst, wenn bestimmte Codierungspraktiken entdeckt werden, die möglicherweise zu potenziellen Fehlern führen (was der Grund für den strikten Modus ist).

Betrachten Sie dieses Beispiel:

var a = 365;
var b = 030;

In ihrer Besessenheit, die numerischen Literale aufzustellen, hat der Entwickler die Variable b mit einem Oktal-Literal initialisiert. Der nicht strikte Modus interpretiert dies als numerisches Literal mit dem Wert 24 (in der Basis 10). Im strikten Modus wird jedoch ein Fehler ausgegeben.

Eine nicht erschöpfende Liste von Spezialitäten im strikten Modus finden Sie in dieser Antwort .

Wo sollte ich 'use strict'; ?

  • In meiner neuen JavaScript-Anwendung: Absolut! Der strikte Modus kann als Whistleblower verwendet werden, wenn Sie mit Ihrem Code etwas Dummes tun.

  • In meinem vorhandenen JavaScript-Code: Wahrscheinlich nicht! Wenn Ihr vorhandener JavaScript-Code Anweisungen enthält, die im strikten Modus verboten sind, wird die Anwendung einfach beschädigt. Wenn Sie den strikten Modus wünschen, sollten Sie bereit sein, Ihren vorhandenen Code zu debuggen und zu korrigieren. Deshalb verwenden Sie 'use strict'; macht Ihren Code nicht plötzlich besser .

Wie verwende ich den strikten Modus?

  1. Fügen Sie ein 'use strict'; Aussage über Ihrem Skript:

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

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

  2. Oder fügen Sie eine 'use strict'; Aussage über Ihrem Funktionskörper:

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

    Alles im lexikalischen Funktionsumfang doSomething wird im strikten Modus interpretiert. Das Wort lexikalisch ist hier wichtig. Siehe diese Antwort für eine bessere Erklärung.

Welche Dinge sind im strikten Modus verboten?

Ich habe einen schönen Artikel gefunden , der einige Dinge beschreibt, die im strikten Modus verboten sind (beachten Sie, dass dies keine ausschließliche Liste ist):

Umfang

In der Vergangenheit wurde JavaScript durch den Umfang der Funktionen verwirrt. Manchmal scheinen sie statisch zu sein, aber einige Funktionen verhalten sich so, als wären sie dynamisch. Dies ist verwirrend und macht es schwierig, Programme zu lesen und zu verstehen. Missverständnis verursacht Fehler. Es ist auch ein Problem für die Leistung. Statisches Scoping würde die Bindung von Variablen zur Kompilierzeit ermöglichen, aber die Anforderung an einen dynamischen Bereich bedeutet, dass die Bindung auf die Laufzeit verschoben werden muss, was mit einem erheblichen Performance-Nachteil verbunden ist.

Der strikte Modus erfordert, dass alle Variablenbindungen statisch erfolgen. Das bedeutet, dass die Funktionen, die zuvor für die dynamische Bindung erforderlich waren, entfernt oder geändert werden müssen. Insbesondere wird die with-Anweisung entfernt und die Fähigkeit der eval-Funktion, die Umgebung ihres Aufrufers zu manipulieren, ist stark eingeschränkt.

Strikter Code bietet den Vorteil, dass Tools wie YUI Compressor bei der Verarbeitung eine bessere Leistung erbringen können.

Implizierte globale Variablen

JavaScript hat globale Variablen impliziert. Wenn Sie eine Variable nicht explizit deklarieren, wird implizit eine globale Variable für Sie deklariert. Dies erleichtert den Anfängern die Programmierung, da sie einige grundlegende Haushaltsaufgaben vernachlässigen können. Dies erschwert jedoch die Verwaltung größerer Programme und beeinträchtigt die Zuverlässigkeit erheblich. Im strikten Modus werden implizite globale Variablen nicht mehr erstellt. Sie sollten alle Ihre Variablen explizit deklarieren.

Globale Leckage

Es gibt eine Reihe von Situationen, die dazu führen könnten, dass this an das globale Objekt gebunden ist. Wenn Sie beispielsweise vergessen, das new Präfix anzugeben, wenn Sie eine Konstruktorfunktion aufrufen, wird dies vom Konstruktor unerwartet an das globale Objekt gebunden. Statt ein neues Objekt zu initialisieren, manipuliert es stattdessen automatisch globale Variablen. In diesen Situationen bindet der strikte Modus dies stattdessen an undefined , wodurch der Konstruktor stattdessen eine Ausnahme auslöst, wodurch der Fehler viel früher erkannt wird.

Lautes Versagen

JavaScript hatte immer schreibgeschützte Eigenschaften. Sie konnten sie jedoch erst selbst erstellen, wenn die Object.createProperty Funktion von Object.createProperty Funktion Object.createProperty . Wenn Sie versucht haben, einer schreibgeschützten Eigenschaft einen Wert zuzuweisen, schlägt dies unbemerkt fehl. Die Zuweisung würde den Wert der Eigenschaft nicht ändern, aber Ihr Programm würde so vorgehen, als ob es gewesen wäre. Dies ist ein Integritätsrisiko, das dazu führen kann, dass Programme in einen inkonsistenten Zustand versetzt werden. Im strikten Modus wird beim Versuch, eine schreibgeschützte Eigenschaft zu ändern, eine Ausnahme ausgelöst.

Oktal

Die oktale (oder Basis-8) -Darstellung von Zahlen war äußerst nützlich, wenn auf Maschinenebene auf Maschinen programmiert wurde, deren Wortgrößen ein Vielfaches von 3 waren. Bei der Arbeit mit dem CDC 6600-Mainframe, der eine Wortgröße von 60 Bit hatte, war Oktal erforderlich. Wenn Sie Oktal lesen könnten, könnten Sie ein Wort mit 20 Ziffern betrachten. Zwei Ziffern stellten den Operationscode dar, und eine Ziffer identifizierte eines von 8 Registern. Während des langsamen Übergangs von Maschinencodes zu Hochsprachen wurde es als nützlich erachtet, Oktalformen in Programmiersprachen bereitzustellen.

In C wurde eine äußerst unglückliche Darstellung der Oktalität gewählt: Führender Nullpunkt. In C bedeutet 0100 64, nicht 100 und 08 ist ein Fehler, nicht 8. Außerdem wurde dieser Anachronismus in fast alle modernen Sprachen kopiert, einschließlich JavaScript, wo er nur zur Erzeugung von Fehlern verwendet wird. Es hat keinen anderen Zweck. Im strengen Modus sind also keine Oktalformen mehr zulässig.

Und so weiter

Das Argument-Pseudo-Array wird in ES5 etwas mehr Array-artig. Im strikten Modus verliert es seine callee und callee . Dadurch ist es möglich, Ihre arguments an nicht vertrauenswürdigen Code zu übergeben, ohne viel vertraulichen Kontext aufzugeben. Auch die arguments von Funktionen wird eliminiert.

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

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

ECMAScript 5 fügt eine Liste der reservierten Wörter hinzu. Wenn Sie sie als Variablen oder Argumente verwenden, wird im strikten Modus ein Fehler ausgegeben. Die reservierten Wörter sind:

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

Lesen Sie weiter




Ich möchte eine etwas fundiertere Antwort geben, die die anderen Antworten ergänzt. Ich hatte gehofft, die populärste Antwort zu bearbeiten, schlug aber fehl. Ich habe versucht, es so umfassend und vollständig wie möglich zu gestalten.

Weitere Informationen finden Sie in der MDN-Dokumentation .

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

Richtlinien ähneln Aussagen, unterscheiden sich jedoch.

  • use strict enthält keine Schlüsselwörter: Die Direktive 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 Nebeneffekte. Es wird erwartet, dass zukünftige Versionen der ECMAScript-Standards die use als echtes Schlüsselwort einführen. die Zitate würden damit überflüssig werden.
  • use strict kann nur am Anfang eines Skripts oder einer Funktion verwendet werden, dh es muss vor jeder anderen (echten) Anweisung stehen. Es muss nicht die erste Anweisung in einem Funktionsskript sein: Es können andere Anweisungsausdrücke vorangestellt werden, die aus String-Literalen bestehen (und JavaScript-Implementierungen können sie als implementierungsspezifische Anweisungen behandeln). String-Literals-Anweisungen, die auf eine erste echte Anweisung (in einem Skript oder einer Funktion) folgen, sind einfache Ausdrucks-Anweisungen. Dolmetscher dürfen sie nicht als Richtlinien interpretieren und haben keine Wirkung.

Die Anweisung use strict zeigt an, dass der folgende Code (in einem Skript oder einer Funktion) strikter Code ist. Der Code auf der höchsten Ebene eines Skripts (Code, der nicht in einer Funktion enthalten ist) wird als strikter Code betrachtet, wenn das Skript eine Anweisung für die use strict Anweisungen enthält. Der Inhalt einer Funktion wird als strikter Code betrachtet, wenn die Funktion selbst in einem strengen Code definiert ist oder wenn die Funktion eine Anweisung für eine use strict enthält. Code, der an eine eval() -Methode übergeben wird, gilt als strikter Code, wenn eval() von einem strengen Code aus aufgerufen wurde oder die Anweisung use strict selbst enthält.

Der strikte Modus von ECMAScript 5 ist eine eingeschränkte Teilmenge der JavaScript-Sprache, die relevante Sprachdefizite beseitigt und eine strengere Fehlerprüfung und höhere Sicherheit bietet. Im Folgenden sind die Unterschiede zwischen dem strikten Modus und dem normalen Modus aufgeführt (von denen die ersten drei besonders wichtig sind):

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

  • Im strikten Modus erhalten Sie einen TypeError , wenn Sie versuchen, Readonly-Eigenschaften zuzuweisen oder neue Eigenschaften für ein nicht erweiterbares Objekt zu definieren. (Im Normalmodus schlagen beide einfach ohne Fehlermeldung fehl.)

  • Im strikten Modus können Sie beim Übergeben von Code an eval() keine Variablen oder Funktionen im Gültigkeitsbereich des Aufrufers deklarieren oder definieren (wie im normalen Modus möglich). Stattdessen wird ein neuer Gültigkeitsbereich für eval() und die Variablen und Funktionen befinden sich in diesem Gültigkeitsbereich. Dieser Bereich wird zerstört, nachdem eval() Ausführung abgeschlossen hat.
  • Im strikten Modus enthält das Argumentobjekt einer Funktion eine statische Kopie der Werte, die an diese Funktion übergeben werden. Im normalen Modus verhält sich das arguments-object etwas "magisch": Die Elemente des Arrays und die benannten Funktionsparameter verweisen auf denselben Wert.
  • Im strikten Modus erhalten Sie einen SyntaxError wenn auf den delete ein nicht qualifizierter Bezeichner (ein Variablen-, Funktions- oder Funktionsparameter) folgt. Im normalen Modus würde der delete nichts bewirken und wird als false ausgewertet.
  • Im strikten Modus erhalten Sie einen TypeError wenn Sie versuchen, eine nicht konfigurierbare Eigenschaft zu löschen. (Im normalen Modus schlägt der Versuch einfach fehl und der delete wird als false ausgewertet.)
  • Im strikten Modus wird dies als syntaktischer Fehler betrachtet, wenn Sie versuchen, mehrere Eigenschaften mit demselben Namen für ein Objektliteral zu definieren. (Im normalen Modus gibt es keinen Fehler.)
  • Im strikten Modus wird es als syntaktischer Fehler betrachtet, wenn eine Funktionsdeklaration mehrere Parameter mit demselben Namen hat. (Im normalen Modus gibt es keinen Fehler.)
  • Im strikten Modus sind Oktal-Literale nicht zulässig (dies sind Literale, die mit 0x . (Im normalen Modus lassen manche Implementierungen Oktal-Literale zu.)
  • Im strikten Modus werden die Bezeichner eval und die arguments 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 strikten Modus gibt es weitere Einschränkungen für die Möglichkeiten, den Aufrufstack zu untersuchen. arguments.caller und arguments.callee verursachen einen TypeError in einer Funktion im strikten Modus. Darüber hinaus verursachen einige Aufrufer- und Argumenteigenschaften von Funktionen im strikten Modus einen TypeError wenn Sie versuchen, sie zu lesen.



Wenn Sie einen Browser verwenden, der im letzten Jahr veröffentlicht wurde, wird wahrscheinlich der strikte JavaScript-Modus unterstützt. Nur ältere Browser, bevor ECMAScript 5 zum aktuellen Standard wurde, unterstützen dies nicht.

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




Beim Hinzufügen "use strict";werfen die folgenden Fälle einen SyntaxError aus, bevor das Skript ausgeführt wird:

  • Ebnet den Weg für zukünftige Versionen ECMAScript , einer der neu reservierten Schlüsselwörter (in prevision für ECMAScript 6 ): implements, interface, let, package, private, protected, public, static, und yield.

  • Funktion in Blöcken deklarieren

    if(a<b){ function f(){} }
    
  • Oktalsyntax

    var n = 023;
    
  • this auf das globale Objekt zeigen.

     function f() {
          "use strict";
          this.a = 1;
     };
     f(); 
    
  • Zweimal den gleichen Namen für einen Eigenschaftsnamen in einem Objektliteral deklarieren

     {a: 1, b: 3, a: 7} 
    

    Dies ist in ECMAScript 6 ( Fehler 1041128 ) nicht mehr der Fall .

  • Deklarieren von zwei Funktionsargumenten mit derselben Namensfunktion

    f(a, b, b){}
    
  • Einen Wert auf eine nicht deklarierte Variable setzen

    function f(x){
       "use strict";
       var a = 12;
       b = a + x*35; // error!
    }
    f();
    
  • Verwendung deletefür einen Variablennamendelete myVariable;

  • Verwenden von evaloder argumentsals Variablen- oder Funktionsargumentname

    "use strict";
    arguments++;
    var obj = { set p(arguments) { } };
    try { } catch (arguments) { }
    function arguments() { } 
    

Quellen:




Das Einfügen use strictam Anfang aller sensiblen JavaScript-Dateien von diesem Punkt aus ist ein kleiner Weg, um ein besserer JavaScript-Programmierer zu sein und zu vermeiden, dass Zufallsvariablen global werden und sich die Dinge unbemerkt ändern.




Einige Leute, die sich im ECMAScript-Komitee befanden, sprechen gut darüber: Änderungen an JavaScript, Teil 1: ECMAScript 5 " darüber, wie der "use strict"JavaScript-Implementierer durch die inkrementelle Verwendung des Switch viele der gefährlichen Funktionen von JavaScript bereinigen kann, ohne plötzlich jede Website zu beschädigen in der Welt.

Natürlich spricht es auch darüber, was viele dieser Fehlfunktionen sind (waren) und wie ECMAScript 5 sie behebt.




Beachten Sie, dass use strictin EcmaScript 5 eingeführt wurde und seitdem beibehalten wurde.

Im Folgenden sind die Bedingungen zum Auslösen des strikten Modus in ES6 und ES7 :

  • Globaler Code ist ein strikter Moduscode, wenn er mit einem Direktive Prolog beginnt, der eine Use Strict-Direktive enthält (siehe 14.1.1).
  • Der Modulcode ist immer ein strikter Moduscode.
  • Alle Teile einer ClassDeclaration oder einer ClassExpression sind strikte Moduscodes .
  • Eval-Code ist ein strikter Moduscode, wenn er mit einem Direktive-Prolog beginnt, der eine Use-Strict-Direktive enthält, oder wenn der Aufruf zum eval ein direktes Eval (siehe 12.3.4.1) ist, der im strengen Moduscode enthalten ist.
  • Der Funktionscode ist ein strikter Moduscode, wenn die zugehörige FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression, MethodDefinition oder ArrowFunction im strikten Moduscode enthalten ist oder wenn der Code, der den Wert des internen [[ECMAScriptCode] - Steckplatzes der Funktion erzeugt, mit einem Direktive Prologue beginnt das enthält eine Use-Strict-Direktive.
  • Funktionscode, der den integrierten Funktions- und Generatorkonstruktoren als Argumente bereitgestellt wird, ist strikter Moduscode, wenn das letzte Argument ein String ist, der bei der Verarbeitung ein FunctionBody ist , der mit einem Direktive Prologue beginnt, der eine Use Strict-Direktive enthält.



Die Hauptgründe, warum Entwickler verwenden sollten, "use strict"sind:

  1. Verhindert versehentliches Deklarieren globaler Variablen. Durch die Verwendung "use strict()"wird sichergestellt, dass Variablen varvor der Verwendung deklariert werden. Z.B:

    function useStrictDemo(){
     'use strict';
     //works fine
     var a = 'No Problem';
    
     //does not work fine and throws error
     k = "problem"
    
     //even this will throw error
     someObject = {'problem': 'lot of problem'};
    }
    
  2. Hinweis: Die "use strict"Direktive wird nur am Anfang eines Skripts oder einer Funktion erkannt.
  3. Die Zeichenfolge "arguments"kann nicht als Variable verwendet werden:

    "use strict";
    var arguments = 3.14;    // This will cause an error
    
  4. Schränkt die Verwendung von Schlüsselwörtern als Variablen ein. Wenn Sie versuchen, sie zu verwenden, werden Fehler ausgegeben.

Kurz gesagt, wird Ihr Code weniger fehleranfällig und Sie werden wiederum dazu gebracht, guten Code zu schreiben.

Mehr darüber erfahren Sie hier .




"streng verwenden"; ist das Bemühen der ECMA, JavaScript etwas robuster zu machen. Es bringt in JS den Versuch, es zumindest etwas "streng" zu machen (andere Sprachen implementieren strikte Regeln seit den 90er Jahren). Es "zwingt" JavaScript-Entwickler, bestimmte Best Practices für das Codieren einzuhalten. Dennoch ist JavaScript sehr zerbrechlich. Es gibt keine typisierten Variablen, typisierten Methoden usw. Ich empfehle JavaScript-Entwicklern dringend, eine robustere Sprache wie Java oder ActionScript3 zu lernen und dieselben bewährten Methoden in Ihrem JavaScript-Code zu implementieren. Dies wird besser funktionieren und einfacher sein debuggen.




Normalerweise folgt das Java-Skript keinen strengen Regeln, was die Fehlerwahrscheinlichkeit erhöht. Nach der Verwendung "use strict"sollte der Java-Skriptcode strengen Regeln entsprechen wie in anderen Programmiersprachen, z. B. Verwendung von Terminatoren, Deklaration vor der Initialisierung usw.

Wenn "use strict"verwendet wird, sollte der Code nach strengen Regeln geschrieben werden, wodurch die Wahrscheinlichkeit von Fehlern und Mehrdeutigkeiten verringert wird.




Related