2016-07-30 6 views
2

Ich habe bemerkt, dass anekdotisch use strict scheint wie folgt häufiger zu sein:Warum ist 'use strict' normalerweise nach einem IIFE (anstatt am Anfang eines Skripts)?

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

als dies:

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

Die vanilla JS implementation of TodoMVC tut dies, zum Beispiel.

Gibt es einen Grund dafür?

Edit: Ich bin mir der Unterscheidung zwischen ganzen Datei und Funktionsblock bewusst. TodoMVC ist ein gutes Beispiel, um zu zeigen, warum dieses Placement für mich seltsam ist, da es nicht auf externe Bibliotheken angewiesen ist, so dass das ganze "Spiel mit nicht strikten Drittparteien" hier nicht zutrifft.

+0

Javascript-Skripte wird häufig verkettet und in eine einzige Datei minimiert. Der erstere Ansatz stellt sicher, dass Sie den Anwendungsbereich von "Use Strict" beschränken. – Groo

Antwort

6

Die Deklaration in local Scope erzwingt, dass der Funktionsblock unter strict-mode vom Browser betrachtet wird.

Sie können für einen anderen Code non-strict Beobachtung haben außerhalb des IIFE


Innen IIFE:

(function() { 
 
    "use strict"; 
 
    a = 100; 
 
})(); 
 
b = 200;


Für gesamte Skript:

"use strict"; 
 
(function() { 
 
    try { 
 
    a = 100; 
 
    } catch (e) { 
 
    console.log(e + ''); 
 
    } 
 

 
})(); 
 
b = 200;

Wie in docs hervorgehoben,

Wenn Sie strict Modus für gesamten Skript verwenden, ist es nicht möglich, blind Nicht-Konflikt-Skripte verketten. Erwägen Sie das Verketten eines strikten Modus-Skripts mit einem nicht strikten Modus-Skript: Die gesamte Verkettung sieht streng aus! Die Umkehrung ist auch wahr: nicht-strikt und streng sieht nicht-streng aus. Die Verkettung von Strict-Modus-Skripten miteinander ist in Ordnung, und die Verkettung von Skripts ohne Striktes ist in Ordnung. Das Verketten von strikten und nicht-strikten Skripten ist problematisch. Es wird daher empfohlen, den strikten Modus für jede Funktion einzeln zu aktivieren (zumindest während der Übergangszeit).

Sie können auch den Ansatz verwenden, den gesamten Inhalt eines Skripts in eine Funktion einzufügen und diese äußere Funktion im strikten Modus zu verwenden. Dies beseitigt das Verkettungsproblem, aber es bedeutet, dass Sie alle globalen Variablen explizit aus dem Funktionsumfang exportieren müssen.

+1

Ich denke, der zweite Absatz aus der Dokumentation ist wahrscheinlich der Marke am nächsten. Meine Vermutung ist, dass dies nur eine Konvention ist, an die die Leute nicht zu oft denken, sondern eine gute Praxis ist. –

2

Wenn Sie mit:

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

Es wird use strict Modus für alle Datei.

Gegenüber, wenn Sie use strict in Funktion wie folgt verwendet:

// Non-strict code... 

(function(){ 
    "use strict"; 
    ... 
    // Define your library strictly... 
})(); 

// Non-strict code... 

die hilfreich sein könnte, wenn Sie alten und neuen Code zu mischen haben.

3

Ich vermute, es ist, weil diese Platzierung ist sicher, strikten Modus aktivieren, auch wenn mehrere JS-Dateien als Build-Schritt verkettet sind (um die Organisation von Code ohne die Leistung Penalty von mehreren HTTP-Anforderungen zu ermöglichen). Mit Platzierung von "use strict" am Anfang der Datei, könnte es ein Problem mit diesen Dateien sein:

foo.js
function doThing() { 
    console.log("done"); 
} 
main.js
"use strict"; 

(function() { 
    document.getElementById('thingy').addEventListener("click", doThing); 
})(); 

Wenn die oben genannten Dateien mit foo.js ersten verketteten wurden, die "use strict" innerhalb main.js hätte keine Wirkung. Diese Möglichkeit könnte vermieden werden, indem die "use strict" in die Funktion eingefügt wird.

Ich weiß nicht, wie üblich Verkettung von JS ist nicht mehr, und ich weiß nicht, ob die neuere require Methode oder import Stichwort Sie "use strict" überall platzieren können Sie, aber vielleicht die Platzierung von "use strict" innerhalb der Funktion gefangen Während einfache Verkettungen populär waren, sahen die Leute keinen Grund, die Konvention zu ändern, nachdem sie sie so lange benutzt hatten.

0

Warum Strict-Modus Bei All eliminiert

Strict-Modus bestimmte permissive Sprache Parsen und Ausführungsmerkmale gelten als weniger wünschenswert aus einer Sprache Design Sicht. 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, ob und wann diese älteren Sprachmerkmale aus den frühen Netscape Tagen veraltet oder ob Strict-Modus wird an einem gewissen Punkt Standardverhalten in allen Browsern werden , aber das strengere Modell wird wahrscheinlich weniger zweideutige und riskante Quelle erzeugen. Wenn Sie die Wartbarkeit, Portabilität und Erweiterbarkeit in Codierungsverfahren und Codebasen verbessern möchten, ist der strikte Modus eine gute Option.

Syntax

"use strict";

Umfang Erklärung

Der Umfang ist abhängig davon, ob Sie die Erklärung innerhalb oder außerhalb einer Funktion platzieren und gilt für alle Aussagen im Anschluss an die Erklärung in den Anwendungsbereich der Schließung.

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 Beginn 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 zumindest in den bereits erfüllten Funktionen eine feinere Codierungspraxis zu fördern.


HINWEIS Für diejenigen, hier kommen aus "What's the benefit of using "function() 'use strict'” in every file?"

können Sie platzieren

"use strict"; 

auf dem oberen Rand des Codesequenz oder innerhalb der Funktion, so dass es nur eine Zeile Code ist pro Datei oder pro Funktion.

Die anderen Codezeilen haben andere Zwecke im Code here.

  • Selbst rufenden Funktion
  • Werk Aufruf
Verwandte Themen