Nie zaleca się używania „use strict” w ES6?

200

Nie znam jeszcze ECMAScript 6. Właśnie sklonowałem repozytorium React Starter Kit, które używa ES6 jako kodu aplikacji. Byłem zaskoczony, widząc, że linter jest skonfigurowany tak, aby zabraniał występowaniu use strictdyrektywy, co moim zdaniem było zalecane w JavaScript wcześniejszych niż ES6. Więc o co chodzi?

Midiparse
źródło

Odpowiedzi:

257

Moduły ES6 są zawsze w trybie ścisłym. Aby zacytować odpowiednią część specyfikacji :

10.2.1 Kod trybu ścisłego

Jednostka syntaktyczna skryptu ECMAScript może być przetwarzana przy użyciu składni i semantyki w trybie nieograniczonym lub ścisłym. Kod jest interpretowany jako kod trybu ścisłego w następujących sytuacjach:

  • Kod globalny jest kodem trybu ścisłego, jeśli zaczyna się od Prologu Dyrektywy, który zawiera Dyrektywę o ścisłym użyciu (patrz 14.1.1).
  • Kod modułu jest zawsze kodem trybu ścisłego.
  • Wszystkie części deklaracji klasy lub wyrażenia klasy są kodem trybu ścisłego.
  • Kod ewaluacyjny jest kodem trybu ścisłego, jeśli zaczyna się od Prologu Dyrektywy, który zawiera dyrektywę ścisłego użycia lub jeśli wezwanie do ewaluacji jest ewaluacją bezpośrednią (patrz 12.3.4.1) zawartą w kodzie trybu ścisłego.
  • Kod funkcji jest kodem trybu ścisłego, jeśli skojarzona funkcjaDeklaracja, FunctionExpression, GeneratorDeclaration, GeneratorExpression, MethodDefinition lub ArrowFunction jest zawarta w kodzie trybu ścisłego lub jeśli kod, który generuje wartość wewnętrznego gniazda [[ECMAScriptCode]], zaczyna się od Prologu Dyrektywy który zawiera dyrektywę o ścisłym użyciu.
  • Kod funkcji dostarczany jako argumenty dla wbudowanych konstruktorów funkcji i generatora jest kodem trybu ścisłego, jeśli ostatnim argumentem jest ciąg znaków, który po przetworzeniu jest obiektem FunctionBody, który zaczyna się od Prologu dyrektywy zawierającego dyrektywę użycia ścisłą.
Kit Sunde
źródło
11
Jaka jest różnica między kodem globalnym a kodem modułu? Myślę, że nie rozumiem, ponieważ kod modułu oznacza dla mnie wszystko w module.js, jeśli jest to wymagane („moduł”).
Maj Oakes,
8
@BrynnMahsman ES2015 ma natywne moduły. CommonJS to tylko biblioteka i nie ma nic wspólnego z językiem.
Kit Sunde,
18
Dzięki za twoją odpowiedź. Czy to nie jest moduł ES6, jeśli nie używa słów kluczowych importu / eksportu? Obecnie używam Węzła 4 i nie mam dostępu do importu / eksportu słów kluczowych i po prostu używam modułu CommonJS module.exports i request () wraz z domyślnie włączonymi funkcjami ES6. To by wyjaśniało, dlaczego muszę umieszczać ścisłe użycie na początku każdego pliku. Więc technicznie nadal piszę moduły CommonJS z niektórymi funkcjami ES6 włączonymi w V8?
Maj Oakes
7
Szczegółowe badanie „czy to moduł?” , patrz nczonline.net/blog/2016/04/ ... "... chociaż obecność importu lub eksportu może wskazywać na moduł, brak importu lub eksportu nie wskazuje wyraźnie, że plik nie jest modułem. nie ma skutecznego sposobu na automatyczne wykrycie, że plik jest modułem podczas analizowania. ”
ptim
1
Czym dokładnie jest „moduł”? Dostaję strictbłąd (z ustawieniem AirBnB ) w skrypcie, który składa się tylko z "use strict"; console.log('foo'). Czy to moduł?
Dan Dascalescu