Sollte ich 'strict' für jede einzelne Javascript-Funktion verwenden, die ich schreibe?

8

Sollte ich "strict" für jede einzelne JavaScript-Funktion verwenden, die ich schreibe?

Was ist eine gute Methode, um in einem großen AngularJS-Projekt strikt anzuwenden? Wenn Sie es global verwenden, können Sie eine Bibliothek eines Drittanbieters, die es nicht unterstützt, durchbrechen, aber "jedes Mal" strikt "zu verwenden ist nur eine Menge Wiederholungen.

    
Won Jun Bae 16.12.2015, 00:16
quelle

4 Antworten

8

Achten Sie bei dieser Frage auf eine allgemeine Tendenz zur Vereinfachung.

Zuerst sollte Ihr gesamter Code unbedingt im strikten Modus ausgeführt werden . Kern moderne JavaScript-Funktionalität ist geändert (siehe .call () und apply () ) oder entstellt ( stille Fehler ), indem Sie Code außerhalb von strikter Modus. (Mehr zu diesem hier , von Crockford aus. )

Dies gilt jedoch nicht für wie Sie sicherstellen sollten, dass Ihr Code im strikten Modus ausgeführt wird. Es gibt mindestens zwei Kontexte zu beachten:

Im Browser sollte Ihr Code nach der Minimierung übermittelt werden. Wenn Sie 'use strict' in jeden Funktionskörper einfügen, wird Ihr Minifier ihn nicht löschen, und Sie werden Bytes verschwenden, die es überall wiederholen. Sie benötigen es nur in den äußersten Funktionsbereichen, oben in den Moduldefinitionen. Ein Ansatz besteht darin, Ihren minimierten Code als Teil des Build-Prozesses in einen einzigen IIFE-Abschluss einzubetten:

%Vor%

Dies ist meines Erachtens der ideale Weg, es zu tun, aber es bedeutet mehr oder weniger, dass Sie einen kontinuierlichen Integrations-Workflow anwenden (da Sie, um Ihren Code im strikten Modus zu beobachten, alles zusammenpacken müssen ein Verschluss). Wenn Sie nicht so arbeiten, müssen Sie die use strict -Direktive am Anfang jeder Funktion einfügen, die nicht innerhalb des Bereichs einer anderen Funktion deklariert wird.

Auf dem Server ist das natürlich viel einfacher. Der Code wird nicht minimiert, und Bytes spielen keine Rolle. Sie können also die Direktive use strict ganz oben in jede Datei einfügen.

Ein Wort der Warnung auf --use_strict : In Fällen, in denen Sie steuern, wie Skripts ausgeführt werden, sind Sie möglicherweise versucht, das Laufzeitflag --use_strict zu verwenden. Es ist einfach, aber es bedeutet, dass alle Abhängigkeiten strikt mode-konform sein müssen. Da Sie nicht alle Compliance-Anforderungen von Drittanbietern kontrollieren können, ist das normalerweise unklug.

    
jeff_mcmahan 16.12.2015, 01:18
quelle
9

Alle Codes, die Sie schreiben 1 sollte in strikter Modus . Es hilft Ihnen, Fehler zu finden indem Ausnahmen nicht ignoriert werden.

Allerdings, no , bedeutet dies nicht, dass Sie "use strict"; jeder function -Definition voranstellen müssen, Sie sollten es nur in den Modulbereich - einmal pro Datei - setzen wird von all deinen Funktionen geerbt. Wenn Sie zu ES6-Modulen wechseln, wird dies trotzdem impliziert .

1: Ich würde sogar dafür plädieren, es global zu aktivieren, da der strikte Modus keinen korrekt geschriebenen Code durchbrechen sollte.
Wenn ein Skript eines Drittanbieters unterbricht, besteht die Lösung möglicherweise nicht darin, den strikten Modus erneut zu deaktivieren ...

    
Bergi 16.12.2015 00:18
quelle
6

Kurze Antwort, ja! Sie müssen es nicht für jede Funktion hinzufügen, sondern Sie können es nur einmal pro JavaScript-Datei hinzufügen. Wenn Sie die Datei starten, beginnen Sie mit einer Schließung wie folgt:

%Vor%     
Praveen Kumar 16.12.2015 00:20
quelle
2

Nein. Die Redundanz ist nicht notwendig. Verwendung der Deklaration

%Vor%

im Datei- oder Stream-Bereich ist vorzuziehen, insbesondere wenn Bibliotheken von Drittanbietern verwendet werden. Es hilft zu entscheiden, ob man sie wie sie benutzt, umschließt oder weitergibt.

Selbstausführende Funktionen auf Dateiebene

Es wird immer üblicher, ganze Dateien oder Streams in selbst ausgeführten Schließungen zu sehen. In solchen Fällen wird die Deklaration für die Verwendung des strikten Modus (oben) in die erste Zeile des Closures eingefügt, wobei ....

ist %Vor%

Es mag nützlich sein, zu erwähnen, dass die Selbstausführung nicht immer notwendig ist und bei übermäßiger Verwendung träge Lasten und andere Probleme verursachen kann.

Mehr zum Umfang der Erklärung

Der Gültigkeitsbereich von hängt davon ab, ob Sie die Deklaration innerhalb oder außerhalb einer Funktion platzieren und auf alle Anweisungen anwenden, die auf die Deklaration innerhalb des Bereichs der Closure folgen.

Die Verwendung der Deklaration innerhalb der Funktion ist der falsche Weg, wenn die gesamte Datei oder der Stream bereits mit dem strengeren Modus kompatibel ist oder dies leicht gemacht werden kann. Die Redundanz ist nicht notwendig, daher ist es empfehlenswert, die Deklaration oben auf der Datei oder am Anfang des Streams zu platzieren.

Manchmal entsprechen nur einige der Funktionen den strengeren Regeln. In solchen Fällen kann der weniger wünschenswerte Funktionsumfang der Deklaration verwendet werden, um feinere Kodierpraktiken zumindest in den bereits erfüllten Funktionen zu fördern.

Warum strict mode überhaupt?

Der strikte Modus beseitigt gewisse permissive Sprachanalyse- und Ausführungseigenschaften, die aus Sicht des Sprachdesigns weniger wünschenswert sind. Diese Merkmale der nicht strikten Modussprache wurden aus Gründen der Abwärtskompatibilität als Standardverhalten angesehen. Die Zusammenfassung und Details erscheinen hier.

Es ist nicht eindeutig definiert, wann und ob diese älteren Sprachmerkmale aus den frühen Netscape-Tagen veraltet sind oder ob der strikte Modus zu einem Standardverhalten in Browsern wird, aber das strengere Modell wird wahrscheinlich weniger zweideutige und riskante Quellen erzeugen . Wenn Sie die Wartbarkeit, Portabilität und Erweiterbarkeit in Codierungsverfahren und Codebasen verbessern möchten, ist der strikte Modus eine gute Option.

HINWEIS Für diejenigen, die von " Was ist der Vorteil von "function ()" verwenden Sie strict "" in jeder Datei? "

Sie können

platzieren %Vor%

am Anfang der Codefolge oder innerhalb der Funktion, so dass es nur eine Zeile Code pro Datei oder pro Funktion gibt.

Die anderen Codezeilen haben andere Zwecke im Code hier .

  • Selbstaufrufende Funktion
  • Fabrikaufruf

Einige stellen die gesamte Datei in eine selbstausführende Funktion, aber das ist nicht in jedem Fall notwendig.

    
Douglas Daseeco 09.02.2017 18:49
quelle

Tags und Links