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.

45voto

Alireza Punkte 92209

"use strict" macht JavaScript-Code zur Ausführung in strenger Modus Das bedeutet, dass alles vor der Verwendung definiert werden muss. Der Hauptgrund für die Verwendung des Strict-Modus ist die Vermeidung versehentlicher globaler Verwendungen von nicht definierten Methoden.

Auch im Strict-Modus laufen die Dinge schneller, einige Warnungen oder stille Warnungen werfen fatale Fehler, es ist besser, es immer zu benutzen, um einen saubereren Code zu machen.

"use strict" ist für die Verwendung in ECMA5 weithin erforderlich, in ECMA6 ist es standardmäßig Teil von JavaScript Es muss also nicht hinzugefügt werden, wenn Sie ES6 verwenden.

Sehen Sie sich diese Aussagen und Beispiele von MDN an:

Die "use strict"-Richtlinie
Die "use strict"-Anweisung ist neu in JavaScript 1.8.5 (ECMAScript Version 5). Es handelt sich nicht um eine Anweisung, sondern um einen literaler Ausdruck, der von früheren Versionen von JavaScript ignoriert wurde. Der Zweck von "use strict" ist es, anzuzeigen, dass der Code im im "Strict-Modus" ausgeführt werden soll. Im strikten Modus können Sie z. B. keine nicht deklarierte Variablen verwenden.

Beispiele für die Verwendung von "use strict":
Strenger Modus für Funktionen: Um den strikten Modus für eine Funktion aufzurufen Funktion aufzurufen, fügen Sie die genaue Anweisung "use strict"; (oder 'use strict';) in vor allen anderen Anweisungen in den Körper der Funktion ein.

1) Strict-Modus in Funktionen

 function strict() {
     // Function-level strict mode syntax
     'use strict';
     function nested() { return 'And so am I!'; }
     return "Hi!  I'm a strict mode function!  " + nested();
 }
 function notStrict() { return "I'm not strict."; }

 console.log(strict(), notStrict());

2) Strict-Modus für das gesamte Skript

'use strict';
var v = "Hi! I'm a strict mode script!";
console.log(v);

3) Zuweisung zu einem nicht beschreibbaren Global

'use strict';

// Assignment to a non-writable global
var undefined = 5; // throws a TypeError
var Infinity = 5; // throws a TypeError

// Assignment to a non-writable property
var obj1 = {};
Object.defineProperty(obj1, 'x', { value: 42, writable: false });
obj1.x = 9; // throws a TypeError

// Assignment to a getter-only property
var obj2 = { get x() { return 17; } };
obj2.x = 5; // throws a TypeError

// Assignment to a new property on a non-extensible object.
var fixed = {};
Object.preventExtensions(fixed);
fixed.newProp = 'ohai'; // throws a TypeError

Sie können mehr lesen auf MDN .

38voto

FutureNerd Punkte 729

Es gibt einen guten Vortrag von einigen Leuten, die im ECMAScript-Ausschuss waren: Änderungen an JavaScript, Teil 1: ECMAScript 5" darüber, wie die schrittweise Nutzung der "use strict" switch ermöglicht es JavaScript-Implementierern, viele der gefährlichen Funktionen von JavaScript zu bereinigen, ohne dass plötzlich jede Website auf der Welt zerstört wird.

Natürlich wird auch darauf eingegangen, was viele dieser Fehlfunktionen sind (waren) und wie ECMAScript 5 sie behebt.

34voto

Tân Punkte 1

Kleine Beispiele zum Vergleich:

Nicht-strikter Modus:

for (i of [1,2,3]) console.log(i)

// output:
// 1
// 2
// 3

Strenger Modus:

'use strict';
for (i of [1,2,3]) console.log(i)

// output:
// Uncaught ReferenceError: i is not defined

Nicht-strikter Modus:

String.prototype.test = function () {
  console.log(typeof this === 'string');
};

'a'.test();

// output
// false

String.prototype.test = function () {
  'use strict';

  console.log(typeof this === 'string');
};

'a'.test();

// output
// true

25voto

Oriol Punkte 9862

Beachten Sie, dass use strict wurde eingeführt in EcmaScript 5 und wurde seither aufbewahrt.

Nachfolgend sind die Bedingungen aufgeführt, unter denen der strenge Modus in ES6 y ES7 :

  • Globaler Code ist Strict-Mode-Code, wenn er mit einem Richtlinienprolog beginnt, der eine Use-Strict-Direktive enthält (siehe 14.1.1).
  • Modulcode ist immer Strict-Mode-Code.
  • Alle Teile eines KlassenDeklaration oder eine KlassenAusdruck sind strict mode code.
  • Eval-Code ist Strict Mode Code, wenn er mit einem Directive Prologue beginnt, der eine Use Strict Directive enthält, oder wenn der Aufruf von eval ein direktes eval (siehe 12.3.4.1) ist, das in Strict Mode Code enthalten ist.
  • Der Funktionscode ist ein Strict Mode Code, wenn der zugehörige FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression, MethodDefinition oder ArrowFunction in Strict-Mode-Code enthalten ist oder wenn der Code, der den Wert des internen [[ECMAScriptCode]]-Slots der Funktion erzeugt, mit einem Directive Prologue beginnt, der eine Use Strict Directive enthält.
  • Funktionscode, der als Argumente an die eingebauten Function- und Generator-Konstruktoren übergeben wird, ist Strict-Mode-Code, wenn das letzte Argument ein String ist, der bei der Verarbeitung ein FunktionsKörper die mit einem Richtlinienprolog beginnt, der eine Use Strict-Richtlinie enthält.

19voto

Pritam Banerjee Punkte 16396

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

  1. Verhindert die versehentliche Deklaration von globalen Variablen. "use strict()" stellt sicher, dass die Variablen mit var vor der Verwendung. 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. N.B: Die "use strict" 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. Der Versuch, sie zu verwenden, führt zu Fehlern.

Kurz gesagt: Ihr Code ist weniger fehleranfällig, und das wiederum wird Sie dazu bringen, guten Code zu schreiben.

Weitere Informationen dazu finden Sie unter aquí .

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