2015-10-06 11 views
6

Jeśli mamCzy klasa IIFE jest wymagana w klasie w ECMAScript/Javascript 6?

Class Car {} 

muszę zawinąć że z naszego zamknięcia funkcji? Czy var dostaje się do okna? lub po prostu do klasy? A co z przeniesieniem? Czy Traceur/Babel zamieniają go w IIFE i wpadasz w var?

Czy muszę:

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

Aby być bezpieczne?

+1

To zależy od tego, czy ładujesz plik jako skrypt, czy jako moduł. Jak ładujesz plik? – loganfsmyth

+0

Natywnie, to naprawdę dobre pytanie. Testowane tutaj z Edge i chociaż mogę mieć plik 'car.js' z deklaracją tej klasy oraz plik' new-car.js' używający tej klasy, jeśli zapiszę 'Car' na konsoli, to pokaże mi konstruktor, ale jeśli loguję 'window.Car', pokazuje' undefined'. – Buzinas

+0

@Buzinas: To trochę inaczej. Deklaracje leksykalne ('class',' let' i 'const') nie stają się właściwościami obiektu globalnego. –

Odpowiedz

1

Można spojrzeć na to, co się dzieje, gdy Babel transpiles kod here

Nie trzeba użyć Iife chyba że chcesz ukryć klasę, a var Class który pobiera generowany jest podnoszony jako dowolna zmienna: deklaracja będzie miała miejsce na początku, ale przypisanie odbędzie się w pierwotnym wierszu.

I tak, Babel zamienia numer let na var, ale także zapewnia dokładną analizę według oczekiwań z dodatkowymi przypisaniami. Jeśli chcesz napisać kod ES6 i go wykonać, nie powinieneś się martwić o te szczegóły, wystarczy postępować zgodnie ze standardem ES6 (ES2015).

1

Nie, nie trzeba go owijać tak długo, dopóki jest to w kodzie traktowanym jako moduł ES6. Domyślne ustawienia Babel traktują kod wejściowy i pliki jako moduły. Babel wprowadza funkcje w różnych miejscach w celu implementacji poprawnej semantyki zakresu i przekształca let w , jeśli masz włączony odpowiedni transformator.

moduły ES6 są zawsze w trybie ścisłym i oto co spec mówi o misji w trybie ścisłym:

przypisanie do identyfikatora nierejestrowaną lub w inny sposób nierozwiązywalne odniesienie nie tworzy własności w światowej obiekt. Gdy proste przypisanie występuje w kodzie trybu ścisłego, jego LeftHandSide nie może oceniać nierozwiązywalnego Reference.

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

Co dokładnie masz na myśli ?:

Czy var Get podniesiona do [...] w klasie?

2

Nie ma potrzeby tworzenia opakowania IIFE dla samochodu klasowego, jak pokazano tutaj, w rzeczywistości, które utworzy kontekst wykonania i ukryje klasę od reszty strony.

Więc po prostu zostawić go jako (a nie małymi literami)

class Car(){} 

Var wciąż wydobywanych w taki sam sposób, to było wcześniej. Zostanie podniesiony do góry kontekstu wykonania. Jeśli kod znajduje się obecnie w kontekście okna, jest to miejsce, w którym kończy się var.

Klasy są nie wyciągnięte w ECMAScript 6. Zatem klasa będzie dostępna dopiero po jej zadeklarowaniu.

+0

Klasy się pobierają, co oznacza, że ​​* wiązanie * jest tworzone podczas wchodzenia w zakres, ale nie jest inicjowane. Zachowuje się jak "let". –

+0

@FelixKling - Tak mówi w MDN. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes "Ważna różnica między deklaracjami funkcji i deklaracjami klas jest taka, że ​​deklaracje funkcji są podnoszone, a deklaracje klas nie są". Czy interpretowałem to niepoprawnie? Wydaje się raczej bezpośredni. –

+0

Mmh, miałem na myśli to, co jest napisane na http://www.ecma-international.org/ecma-262/6.0/#sec-functiondeclarationinstantiation, krok 35. Ale myślę, że "podnoszenie" ma inne znaczenie niż myślałem (może?). klasy i deklaracje "let" zdecydowanie nie są uważane za HoistableDeclaration w specyfikacji, więc myślę, że się myliłem. Jednak nawet specyfikacja nie wydaje się wyraźnie opisywać terminu "podnoszenie". –

Powiązane problemy