2015-11-05 5 views
9

Wie ich es verstehe, ist das IIFE-Muster eine Arbeit um die Tatsache herum, dass ES5 und darunter keine Möglichkeit haben, Blockbereiche zu erstellen. Indem wir alles in eine Funktion einfügen und sofort aufrufen, können wir einen Bereich erstellen.Wird const und lassen Sie das IIFE-Muster unnötig machen?

Jetzt, dass let und const Unterstützung von mehr Browsern erhalten, reduziert dies die Notwendigkeit für etwas wie das IIFE-Muster?

+0

Ich kann ein Argument dafür sehen, wie man einen Block verwenden und ein IIFE ersetzen kann, aber was hat "const" damit zu tun? Das IIFE bietet Ihnen Privatsphäre innerhalb des Geltungsbereichs und vermeidet Namensraumverschmutzung. 'const' hilft bei Namespace-Konflikten überhaupt nicht. Es bietet zwar Schreibschutz, aber keine Privatsphäre. – jfriend00

+0

Werfen Sie einen Blick darauf: [Machen ES6-Module den Fall von IIFEs überflüssig?] (Https://hashnode.com/post/do-es6-modules-make-the-case-of-iifes-obsolete-civ96wet80scqgc538un20es0) –

Antwort

12

Ja, Blöcke werden IEFEs ersetzen, sobald blockorientierte Deklarationen (functions, let/const/class) weit verbreitet sind. Sie benötigen einen Bereich, z.B. für eine Schließung? Hier haben Sie einen Block, sei es ein Schleifenkörper oder nur ein Teil einer Anweisungsliste.

Es gibt jedoch immer noch eine Anwendung von IEFEs, die Blöcke nicht ersetzen können: das Modulmuster. Blöcke nicht Rückgabewerte haben, und mutieren höhere scoped Variablen ist hässlich, so dass wir immer noch Funktion Ausdrücke in der Erstellung von Objekten sehen, die privaten Staat braucht:

const example = (() => { 
    … 
    return …; 
}()); 
+1

Sie würden ES2015-Module verwenden, um privaten Status und Code zu verwalten. Das heißt, wenn sie von Browsern unterstützt werden :( – Esteban

+1

@Esteban: Gute Einwände. Aber ein ES6-Modul erfordert in der Regel eine eigene Datei, und Sie möchten möglicherweise nicht Ihren Code zu weit verbreiten. – Bergi

+0

'Let',' Const' und 'class' sind innerhalb von Blockbereichen beschränkt,' function' jedoch nicht und wird aus einem Blockbereich ausgelaufen. Wenn Sie Funktionen deklarieren, ist weiterhin ein IIFE erforderlich. –

3

Auch wenn der Browser dies unterstützt, wird es immer einen zufälligen Browser geben, der veraltet ist oder keine Unterstützung dafür plant. Bis es in allen gängigen Browsern zum Standard geworden ist, wird empfohlen, dass Sie weiterhin mit Ihrem IIFE-Muster fortfahren, bis Sie es in allen gängigen Browsern finden. Etwas, was Sie tun könnten, ist ein Skript (oder Google Analytics) senden Informationen darüber, ob dies nicht definiert ist oder nicht, und bis Sie mindestens etwa 90% davon sagen, dass es nicht undefiniert ist, sollten Sie mit IIFE fortfahren.

0

Ja, es ist sehr zu empfehlen const zu bedienen und let und auch alle neuen Funktionen von ES6. Es wird möglicherweise nicht von allen Browsern für jetzt unterstützt, aber Sie können einfach Compiler wie Babel in Ihren Anwendungen verwenden, um sicherzustellen, dass sie überall funktionieren.

+1

Sie haben Ihre Argumente nicht erklärt und die Frage nicht wirklich beantwortet. 'const' steht nicht im Zusammenhang mit dem Bereich. ES2015-Module haben viel mehr mit Namen-Abstand zu tun als "const" (und alles in einen Block zu wickeln und "Let" überall nur für das Scoping zu verwenden, scheint mir einfach hack-ish zu sein). – MasterAM

+0

@MasterAM 'const' ist genauso mit dem Geltungsbereich verbunden wie 'let' ist: Sie sind beide block-scoped. Referenzen: [mdn] (https: //developer.mozilla.org/de-DE/docs/Web/JavaScript/Referenz/Statements/const) [2ality] (http://www.2ality.com/2015/02/es6-scoping.html) – Marcus

Verwandte Themen