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.

10voto

Ashish Punkte 1808

use strict"; Legt fest, dass JavaScript-Code im "strict mode" ausgeführt werden soll. "Strict-Modus" ausgeführt wird.

  • Die Richtlinie "use strict" wurde in ECMAScript Version 5 neu eingeführt.
  • Es handelt sich nicht um eine Aussage, sondern um einen wörtlichen Ausdruck, der von früheren Versionen von JavaScript ignoriert.
  • Der Zweck von "use strict" ist es, anzuzeigen, dass der Code im "Strict-Modus" ausgeführt werden soll.
  • Im Strict-Modus können Sie zum Beispiel keine nicht deklarierten Variablen verwenden.

Alle modernen Browser unterstützen "use strict", außer Internet Explorer 9 und niedriger .

Nachteil

Wenn ein Entwickler eine Bibliothek verwendet, die sich im Strict-Modus befindet, der Entwickler aber daran gewöhnt ist, im normalen Modus zu arbeiten, kann es sein, dass er einige Aktionen der Bibliothek aufruft, die nicht wie erwartet funktionieren.

Schlimmer noch, da sich der Entwickler im normalen Modus befindet, hat er nicht den Vorteil, dass zusätzliche Fehler ausgelöst werden, so dass der Fehler möglicherweise unbemerkt bleibt.

Wie bereits erwähnt, verhindert der strenge Modus außerdem, dass Sie bestimmte Dinge tun können.

Im Allgemeinen sind die Leute der Meinung, dass man diese Dinge gar nicht erst verwenden sollte, aber einige Entwickler mögen diese Einschränkung nicht und wollen alle Funktionen der Sprache nutzen.

8voto

snnsnn Punkte 5058

JavaScript wurde aufgrund von Browserkriegen und schlechtem Management übereilt entwickelt und eingeführt. Infolgedessen fanden viele schlechte Designentscheidungen, eine unintuitive Syntax und eine verwirrende Semantik ihren Weg in die Sprache. Der Strict Mode soll einige dieser Fehler korrigieren.

Aber diese Fehler zu beheben, ohne eine alternative Interpretation zu schaffen, bricht die Abwärtskompatibilität. Also, "use strict" Richtlinie erzeugt diese alternative Interpretation des Codes und teilt sie dem Programmierer mit.

Zum Beispiel, this Schlüsselwörter verweisen auf das Objekt in einer Methodendefinition, wie this o self in anderen Sprachen.

let o = {
  name: 'John Doe',
  sayName: function(){
    console.log(this.name);
  }
};

o.sayName(); // 'John Doe'

this hat keinen Zweck außerhalb des Methodenkontextes, aber alle JavaScript-Funktionen haben this Schlüsselwort, unabhängig davon, ob es sich um Methoden handelt oder nicht:

function run() {
  console.log(this);
}

run(); // Window

Hier this löst das globale Objekt auf, was keinen Sinn macht und keinen Zweck erfüllt, da das globale Objekt bereits im Geltungsbereich vorhanden ist.

Im strengen Modus this in einer globalen Funktion wird als undefiniert aufgelöst, was auch erwartet wird.

"use strict"

function run() {
  console.log(this);
}

run(); // undefined

Einige Fehler können selbst im Strict-Modus nicht behoben werden, da die Syntax auch für ältere Browser gültig sein sollte, da diese die "strict mode" Richtlinie. Dies ist beabsichtigt.

7voto

Jerin K Alexander Punkte 253

Der strikte Modus kann Speicherlecks verhindern.

Bitte prüfen Sie die unten stehende Funktion, die im nicht-strikten Modus geschrieben wurde:

function getname(){
    name = "Stack Overflow"; // Not using var keyword
    return name;
}
getname();
console.log(name); // Stack Overflow

In dieser Funktion verwenden wir eine Variable namens name innerhalb der Funktion. Intern prüft der Compiler zunächst, ob in dem betreffenden Funktionsbereich eine Variable mit diesem Namen deklariert ist. Da der Compiler verstanden hat, dass es keine solche Variable gibt, wird er im äußeren Bereich nachsehen. In unserem Fall ist dies der globale Bereich. Auch hier hat der Compiler verstanden, dass im globalen Bereich keine Variable mit diesem Namen deklariert ist, also erstellt er eine solche Variable für uns im globalen Bereich. Konzeptionell wird diese Variable im globalen Bereich erstellt und ist in der gesamten Anwendung verfügbar.

Ein anderes Szenario ist, dass die Variable in einer untergeordneten Funktion deklariert wird. In diesem Fall prüft der Compiler die Gültigkeit dieser Variable im äußeren Bereich, d. h. in der übergeordneten Funktion. Erst dann prüft er im globalen Bereich und legt dort eine Variable für uns an. Das bedeutet, dass zusätzliche Prüfungen durchgeführt werden müssen. Dies beeinträchtigt die Leistung der Anwendung.


Schreiben wir nun die gleiche Funktion im Strict-Modus.

"use strict"
function getname(){
    name = "Stack Overflow"; // Not using var keyword
    return name;
}
getname();
console.log(name); 

Es wird der folgende Fehler angezeigt.

Uncaught ReferenceError: name is not defined
at getname (<anonymous>:3:15)
at <anonymous>:6:5

Hier löst der Compiler den Referenzfehler aus. Im Strict-Modus erlaubt der Compiler nicht, die Variable zu verwenden, ohne sie zu deklarieren. So können Speicherlecks verhindert werden. Außerdem können wir einen optimierten Code schreiben.

7voto

mishsx Punkte 1259

Im strikten Modus werden Fehler beseitigt, die im nicht-strikten Modus ignoriert werden würden, wodurch Javascript "sicherer" wird.

Gehört sie zu den besten Praktiken?

Es gehört zu den besten Praktiken bei der Arbeit mit Javascript, die folgenden Elemente einzubeziehen Strenger Modus . Dies geschieht durch Hinzufügen der folgenden Codezeile in Ihre JS-Datei.

'use strict';

in Ihrem Code.

Was bedeutet das für die Benutzeragenten?

Die Angabe, dass Code im strikten Modus interpretiert werden soll, bedeutet für Benutzeragenten wie Browser, dass sie den Code wörtlich so behandeln sollen, wie er geschrieben wurde, und einen Fehler ausgeben, wenn der Code keinen Sinn ergibt.

Zum Beispiel: Berücksichtigen Sie in Ihrem .js Datei haben Sie den folgenden Code:

Szenario 1: [KEIN STRENGER MODUS]

var city = "Chicago"
console.log(city) // Prints the city name, i.e. Chicago

Szenario 2: [KEIN STRENGER MODUS]

city = "Chicago"
console.log(city) // Prints the city name, i.e. Chicago

Warum wird der Variablenname dann in beiden Fällen gedruckt?

Wenn der Strict Mode nicht aktiviert ist, müssen Benutzeragenten oft eine Reihe von Änderungen an problematischem Code vornehmen, um ihn sinnvoll zu gestalten. Oberflächlich betrachtet kann dies eine gute Sache sein, und in der Tat ermöglicht es die Arbeit außerhalb des Strict-Modus den Leuten, sich mit JavaScript-Code vertraut zu machen, ohne alle Details genau zu kennen. Als Entwickler möchte ich jedoch keinen Fehler in meinem Code hinterlassen, weil ich weiß, dass er später wieder auftauchen und mich beißen könnte, und ich möchte auch einfach guten Code schreiben. Und genau dabei hilft der Strict-Modus.

Szenario 3: [STRENGER MODUS]

'use strict';

city = "Chicago"
console.log(city) // Reference Error: asignment is undeclared variable city.

Zusätzlicher Tipp: Um die Codequalität im Strict-Modus aufrechtzuerhalten, müssen Sie dies nicht immer wieder schreiben, insbesondere wenn Sie mehrere .js Datei. Sie können diese Regel global in eslint Regeln wie folgt:

Dateiname: .eslintrc.js

module.exports = {
    env: {
        es6: true
    },
    rules : {
        strict: ['error', 'global'],
        },
    };

Okay, was wird also im strengen Modus verhindert?

  • Eine Variable verwenden, ohne sie zu deklarieren wird im Strict-Modus einen Fehler auslösen. Damit soll verhindert werden, dass ungewollt globale Variablen in der gesamten Anwendung erstellt werden. Das Beispiel mit dem Drucken von Chicago deckt dies im Besonderen ab.

  • Löschen einer Variablen, einer Funktion oder eines Arguments ist im strikten Modus nicht zulässig.

    "use strict";
     function x(p1, p2) {}; 
     delete x; // This will cause an error
  • Duplizieren eines Parameternamens es no im strengen Modus erlaubt.

     "use strict";
     function x(p1, p1) {};   // This will cause an error
  • Reservierte Wörter in der Javascript-Sprache sind nicht erlaubt im strengen Modus. Die Wörter sind implements interface, let, packages, private, protected, public, static und yield

Eine ausführlichere Liste finden Sie in der MDN-Dokumentation hier: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode

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