Não é recomendado usar "use strict" no ES6?

200

Ainda não estou familiarizado com o ECMAScript 6. Acabei de clonar o repositório do React Starter Kit, que usa o ES6 para o código do aplicativo. Fiquei surpreso ao ver que o linter está configurado para proibir ocorrências da use strictdiretiva, o que eu achava que era recomendado no JavaScript anterior ao ES6. Então qual é o objetivo?

Midiparse
fonte

Respostas:

257

Os módulos ES6 estão sempre no modo estrito. Para citar a parte relevante das especificações :

10.2.1 Código do modo estrito

Uma unidade sintática ECMAScript Script pode ser processada usando sintaxe e semântica de modo irrestrito ou estrito. O código é interpretado como código de modo estrito nas seguintes situações:

  • O código global é um código de modo estrito se começar com um prólogo de diretiva que contém uma diretiva de uso estrito (consulte 14.1.1).
  • O código do módulo é sempre código de modo estrito.
  • Todas as partes de um ClassDeclaration ou ClassExpression são código de modo estrito.
  • O código de avaliação é um código de modo estrito se começar com um prólogo de diretiva que contenha uma diretiva de uso estrito ou se a chamada para avaliação for uma avaliação direta (consulte 12.3.4.1) contida no código de modo estrito.
  • O código da função é um código de modo estrito se o FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression, MethodDefinition ou ArrowFunction estiver contido no código de modo estrito ou se o código que produz o valor do slot interno [[ECMAScriptCode]] da função começar com um Prólogo de Diretiva que contém uma diretiva estrita de uso.
  • O código de função que é fornecido como argumento para os construtores Function e Generator internos é um código de modo estrito se o último argumento for uma String que, quando processada, é um FunctionBody que começa com um prólogo de diretiva que contém uma diretiva de uso estrito.
Kit Sunde
fonte
11
Qual é a diferença entre código global e código de módulo? Acho que estou entendendo errado, pois o código do módulo para mim significa tudo no module.js, se eu precisar ('module').
May Oakes
8
@BrynnMahsman ES2015 possui módulos nativos. O CommonJS é apenas uma biblioteca e não tem nada a ver com o idioma.
Kit Sunde
18
Obrigado pela sua resposta. Portanto, não é um módulo ES6 se ele não usa as palavras-chave de importação / exportação? No momento, estou usando o Nó 4 e não tenho acesso para importar / exportar palavras-chave e apenas o módulo CommonJS.exports e require () juntamente com os recursos do ES6 ativados por padrão. Isso explicaria por que tenho de usar rigorosamente no topo de cada arquivo. Então, tecnicamente, ainda estou escrevendo módulos CommonJS com alguns recursos do ES6 ativados no V8?
May Oakes
7
Para um exame detalhado de "é um módulo?" , consulte nczonline.net/blog/2016/04/… "... enquanto a presença de importação ou exportação pode indicar um módulo, a falta de importação ou exportação não indica claramente que o arquivo não é um módulo. Portanto, existe nenhuma maneira eficaz de detectar automaticamente que um arquivo é um módulo durante a análise ".
PTIM
1
O que exatamente é um "módulo"? Eu recebo o stricterro (com a predefinição AirBnB ) em um script que consiste apenas em "use strict"; console.log('foo'). Isso é um módulo?
Dan Dascalescu