2015-10-06 5 views
6

Wenn ichWird in ECMAScript/Javascript 6 ein IIFE für die Klasse benötigt?

Class Car {} 

muss ich das wickeln mit unserer Funktion Schließung? Werden Var's zum Fenster gehievt? oder einfach nur zur Klasse? Wie sieht es mit der Transposition aus? Verwandelt Traceur/Babel es in ein IIFE und lassen Sie uns in Var's?

Muss ich brauche:

(function(){ 
    Class Car() {} 
}()); 

sicher zu sein?

+1

Das hängt davon ab, ob Sie die Datei als Skript oder als Modul laden. Wie laden Sie die Datei? – loganfsmyth

+0

Nativ ist es eine wirklich gute Frage. Getestet hier mit Edge, und obwohl ich eine 'car.js'-Datei mit dieser Klassendeklaration und eine 'new-car.js'-Datei mit dieser Klasse haben kann, wenn ich' Car' in die Konsole logge, zeigt es mir die Konstruktor, aber wenn ich 'window.Car' logge, wird 'undefined' angezeigt. – Buzinas

+0

@Buzinas: Das ist ein bisschen anders. Lexikalische Deklarationen ('class',' let' und 'const') werden keine Eigenschaften des globalen Objekts. –

Antwort

1

Sie können schauen, was passiert, wenn Babel Code transpiles here

Sie brauchen keine IIFE zu verwenden, wenn Sie die Klasse verstecken wollen, und die var Class, die hochgezogen wird, erzeugt wird als jede Variable: Die Deklaration wird am Anfang stattfinden, aber die Zuordnung erfolgt in der ursprünglichen Zeile.

Und ja, Babel dreht let in var, aber es kümmert sich auch Scoping funktioniert wie erwartet mit zusätzlichen Anweisungen. Wenn Sie nur ES6-Code schreiben und ausführen möchten, sollten Sie sich keine Gedanken um diese Details machen. Folgen Sie einfach dem ES6 (ES2015) -Standard.

1

Nein, es ist nicht notwendig, es so zu verpacken, wie es in Code ist, der als ES6-Modul behandelt wird. In den Standardeinstellungen von Babel werden Eingabecode und Dateien als Module behandelt. Babel führt Funktionen an verschiedenen Stellen ein, um die korrekte Bereichsdefinition zu implementieren, und wandelt let in var um, wenn der entsprechende Transformator aktiviert ist.

ES6 Module sind immer im strikten Modus und hier ist es, was die Spezifikation im strikten Modus über Zuordnung sagt:

Zuordnung zu einem nicht deklarierten Bezeichner oder auf andere Weise nicht auflösbaren Referenz keine Eigenschaft im globalen Objekt erstellen. Wenn innerhalb des strikten Moduscodes eine einfache Zuweisung stattfindet, darf dessen LeftHandSide nicht zu einer nicht auflösbaren Referenz ausgewertet werden.

http://www.ecma-international.org/ecma-262/6.0/#sec-strict-mode-of-ecmascript

Was genau meinen Sie ?:

var Sie ist zu gehisst bekommen [...] die Klasse?

2

Es muss nicht ein IIFE Wrapper für die Klasse Auto sein, wie hier gezeigt, in der Tat, die einen Ausführungskontext und versteckt die Klasse aus dem Rest der Seite wird erstellen.

Sie würde also lass es einfach als (nicht das untere Gehäuse)

class Car(){} 

Var noch in der gleichen Art und Weise hochgezogen wird es vorher war. Es wird an den Anfang des Ausführungskontexts gehoben. Wenn sich der Code momentan im Kontext des Fensters befindet, wird die Variable dort enden.

Klassen sind nicht hochgezogen in ECMAScript 6. So wird die Klasse erst verfügbar sein, nachdem es deklariert wurde.

+0

Klassen werden gehisst, was bedeutet, dass die * Bindung * beim Eingeben des Bereichs erstellt wird, aber es ist nicht initialisiert. Es verhält sich wie Let. –

+0

@FelixKling - So steht es bei MDN. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes "Ein wichtiger Unterschied zwischen Funktionsdeklarationen und Klassendeklarationen ist, dass Funktionsdeklarationen geholt werden und Klassendeklarationen nicht." Habe ich es falsch interpretiert? Es scheint eher direkt. –

+0

Mmh, ich bezog mich darauf, was in http://www.ecma-international.org/ecma-262/6.0/#sec-functiondeclarationinstantiation, Schritt 35 geschrieben wird. Aber ich denke, "hissen" hat eine andere Bedeutung als ich dachte (könnte sein?). Klassen und Let-Deklarationen werden in der Spezifikation definitiv nicht als HoistableDeclaration betrachtet, also habe ich mich geirrt. Jedoch scheint selbst die Spezifikation den Begriff "Hochziehen" nicht explizit zu beschreiben. –

Verwandte Themen