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.

5505voto

Pascal MARTIN Punkte 384469

Update für ES6-Module

Innerhalb native ECMAScript-Module (mit import y export Anweisungen) und ES6-Klassen Der strenge Modus ist immer aktiviert und kann nicht deaktiviert werden.

Ursprüngliche Antwort

Dieser Artikel über Javascript Strict Mode könnte Sie interessieren: John Resig - ECMAScript 5 Strict Mode, JSON und mehr

Um einige interessante Stellen zu zitieren:

Der Strict Mode ist eine neue Funktion in ECMAScript 5, die es Ihnen ermöglicht, ein Programm oder eine Funktion in einen "strikten" Betriebskontext zu setzen. Dieser strikte Kontext verhindert, dass bestimmte Aktionen ausgeführt werden und löst mehr Ausnahmen aus.

Und:

Der strenge Modus hilft in mehrfacher Hinsicht:

  • Es fängt einige häufige Programmierfehler ab und löst Ausnahmen aus.
  • Sie verhindert oder löst Fehler aus, wenn relativ "unsichere" Aktionen durchgeführt werden (z. B. der Zugriff auf das globale Objekt).
  • Sie deaktiviert Funktionen, die verwirrend oder schlecht durchdacht sind.

Beachten Sie auch, dass Sie den "strengen Modus" auf die gesamte Datei anwenden können... Oder Sie können ihn nur für eine bestimmte Funktion verwenden (ich zitiere immer noch aus dem Artikel von John Resig) :

// Non-strict code...

(function(){
  "use strict";

  // Define your library strictly...
})();

// Non-strict code...

Das kann hilfreich sein, wenn man alten und neuen Code mischen muss ;-)

Ich nehme an, es ist ein bisschen wie die "use strict" können Sie in Perl verwenden (daher der Name?) : Es hilft Ihnen, weniger Fehler zu machen, indem es mehr Dinge erkennt, die zu Brüchen führen könnten.

Strenger Modus ist jetzt unterstützt von allen wichtigen Browsern .

1435voto

seth Punkte 35911

Dies ist eine neue Funktion von ECMAScript 5. John Resig schrieb eine schöne Zusammenfassung davon.

Es handelt sich dabei um eine Zeichenkette, die Sie in Ihre JavaScript-Dateien einfügen (entweder am Anfang Ihrer Datei oder innerhalb einer Funktion) und die wie folgt aussieht:

"use strict";

Wenn Sie es jetzt in Ihren Code einfügen, sollte es keine Probleme mit aktuellen Browsern geben, da es nur eine Zeichenkette ist. Es kann jedoch in der Zukunft zu Problemen mit Ihrem Code führen, wenn Ihr Code gegen das Pragma verstößt. Zum Beispiel, wenn Sie derzeit foo = "bar" ohne Definition foo zuerst, wird Ihr Code anfangen zu scheitern...was meiner Meinung nach eine gute Sache ist.

870voto

gprasant Punkte 14621

Die Erklärung "use strict"; weist den Browser an, den Strict-Modus zu verwenden, bei dem es sich um einen reduzierten und sichereren Funktionssatz von JavaScript handelt.

Liste der Merkmale (nicht erschöpfend)

  1. Erlaubt keine globalen Variablen. (Fängt fehlende var Deklarationen und Tippfehler in Variablennamen)

  2. Stille fehlgeschlagene Zuweisungen führen zu Fehlern im strengen Modus (Zuweisung von NaN = 5; )

  3. Der Versuch, nicht löschbare Eigenschaften zu löschen, führt zu einem Fehler ( delete Object.prototype )

  4. Erfordert, dass alle Eigenschaftsnamen in einem Objektliteral eindeutig sind ( var x = {x1: "1", x1: "2"} )

  5. Funktionsparameternamen müssen eindeutig sein ( function sum (x, x) {...} )

  6. Verbietet die oktale Syntax ( var x = 023; einige Entwickler gehen fälschlicherweise davon aus, dass eine vorangestellte Null nichts an der Zahl ändert).

  7. Verbietet die with Stichwort

  8. eval im strikten Modus werden keine neuen Variablen eingeführt

  9. Verbietet das Löschen von Klarnamen ( delete x; )

  10. Verbietet die Bindung oder Abtretung der Namen eval y arguments in jeder Form

  11. Im strikten Modus werden keine Eigenschaften der arguments Objekt mit den formalen Parametern. (z.B. in function sum (a,b) { return arguments[0] + b;} Dies funktioniert, weil arguments[0] ist gebunden an a und so weiter. ) ( Voir examples Abschnitt unten, um den Unterschied zu verstehen )

  12. arguments.callee wird nicht unterstützt

[Ref: Strenger Modus , Mozilla-Entwickler-Netzwerk ]


Beispiele:

  1. Der Code im strikten Modus verweist nicht auf die Eigenschaften der darin erstellten Argumente

    function show( msg ){ msg = 42; console.log( msg ); // msg === 42 console.log( arguments[0] ); // arguments === 42 } show( "Hey" );

    // In strict mode arguments[i] does not track the value of // the corresponding named argument, nor does a named argument track the value in the corresponding arguments[i] function showStrict( msg ){ "use strict"; msg = 42; console.log( msg ); // msg === 42 console.log( arguments[0] ); // arguments === "Hey" } showStrict( "Hey" );

10 Stimmen

Das Beispiel für 11. ist unklar, es ist nicht klar, worin der Unterschied im strengen Modus besteht.

490voto

Jamie Hutber Punkte 24382

Wenn die Menschen besorgt sind über die Verwendung use strict könnte es sich lohnen, diesen Artikel zu lesen:

ECMAScript 5 "Strict mode" Unterstützung in Browsern. Was bedeutet dies?
NovoGeek.com - Krishnas Weblog

Es geht um die Browserunterstützung, aber vor allem darum, 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.
*/

268voto

DWoldrich Punkte 3615

Ein Wort der Warnung an alle hartgesottenen Programmierer: Die Anwendung "use strict" zu bestehendem Code kann gefährlich sein! Es handelt sich nicht um einen Wohlfühl-Aufkleber, den man auf den Code kleben kann, um ihn "besser" zu machen. Mit dem "use strict" pragma, wird der Browser plötzlich Ausnahmen an zufälligen Stellen auslösen, die er vorher nie ausgelöst hat, nur weil Sie an dieser Stelle etwas tun, was standardmäßiges/lockeres JavaScript fröhlich erlaubt, aber striktes JavaScript verabscheut! Sie können Strictness-Verletzungen in selten genutzten Aufrufen in Ihrem Code verstecken, die nur dann eine Ausnahme auslösen, wenn sie schließlich ausgeführt werden - z.B. in der Produktionsumgebung, die Ihre zahlenden Kunden nutzen!

Wenn Sie den Schritt wagen wollen, sollten Sie sich bewerben "use strict" zusammen mit umfassenden Unit-Tests und einem streng konfigurierten JSHint-Build-Task, der Ihnen die Gewissheit gibt, dass es keine dunkle Ecke in Ihrem Modul gibt, die fürchterlich explodiert, nur weil Sie den Strict Mode aktiviert haben. Oder, hey, hier ist eine weitere Option: Fügen Sie einfach keine "use strict" zu einem Ihrer Legacy-Codes hinzufügen, ist es so wahrscheinlich sicherer, ehrlich gesagt. DEFINITIV NICHT hinzufügen. "use strict" zu Modulen, die Sie nicht besitzen oder pflegen, wie Module von Dritten.

Ich denke, auch wenn es ein tödliches Käfigtier ist, "use strict" kann eine gute Sache sein, aber man muss es richtig machen. Der beste Zeitpunkt für eine strenge Vorgehensweise ist, wenn Ihr Projekt noch ganz neu ist und Sie ganz von vorne anfangen. Konfigurieren Sie JSHint/JSLint mit allen Warnungen und Optionen so weit aufgedreht, wie es Ihr Team verkraften kann, ein gutes Build/Test/Assert-System du jour eingerichtet wie Grunt+Karma+Chai und erst DANN beginnen Sie, alle Ihre neuen Module als "use strict" . Seien Sie darauf vorbereitet, viele kleine Fehler und Warnungen zu beseitigen. Stellen Sie sicher, dass jeder den Ernst der Lage versteht, indem Sie den Build so konfigurieren, dass er fehlschlägt, wenn JSHint/JSLint führt zu Verstößen.

Mein Projekt war kein Projekt auf der grünen Wiese, als ich die "use strict" . Das Ergebnis ist, dass mein IDE voller roter Flecken ist, weil ich keine "use strict" auf der Hälfte meiner Module, und JSHint beschwert sich darüber. Es ist eine Erinnerung an mich, was Refactoring ich in Zukunft tun sollte. Mein Ziel ist es, frei von roten Markierungen zu sein, weil alle meine fehlenden "use strict" Aussagen, aber das ist noch Jahre entfernt.

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