¿No se recomienda usar "use estricto" en ES6?

200

Todavía no estoy familiarizado con ECMAScript 6. Acabo de clonar el repositorio React Starter Kit, que usa ES6 para el código de la aplicación. Me sorprendió ver que el linter está configurado para prohibir las ocurrencias de la use strictdirectiva, que pensé que se recomendaba en JavaScript anterior a ES6. ¿Entonces cuál es el punto?

Midiparse
fuente

Respuestas:

257

Los módulos ES6 siempre están en modo estricto. Para citar la parte relevante de la especificación :

10.2.1 Código de modo estricto

Una unidad sintáctica de ECMAScript Script puede procesarse utilizando sintaxis y semántica en modo estricto o sin restricciones. El código se interpreta como código de modo estricto en las siguientes situaciones:

  • El código global es un código de modo estricto si comienza con un Prólogo de directiva que contiene una Directiva de uso estricto (consulte 14.1.1).
  • El código del módulo es siempre un código de modo estricto.
  • Todas las partes de una declaración de clase o una expresión de clase son códigos de modo estrictos.
  • El código de evaluación es un código de modo estricto si comienza con un Prólogo de directiva que contiene una Directiva de uso estricto o si la llamada a evaluación es una evaluación directa (consulte 12.3.4.1) que está contenida en un código de modo estricto.
  • El código de función es código de modo estricto si la Declaración de función, Expresión de función, Declaración de generador, Expresión de generador, Definición de método o Flechafunción asociada está contenida en el código de modo estricto o si el código que produce el valor de la ranura interna [[ECMAScriptCode]] de la función comienza con un Prólogo directivo que contiene una Directiva de uso estricto.
  • El código de función que se proporciona como argumentos para los constructores de función y generador incorporados es un código de modo estricto si el último argumento es una Cadena que cuando se procesa es un FunctionBody que comienza con un Prólogo de directiva que contiene una Directiva de uso estricto.
Kit Sunde
fuente
11
¿Cuál es la diferencia entre el código global y el código del módulo? Creo que estoy malentendido, ya que el código del módulo para mí significa todo en module.js si lo requiero ('módulo').
Mayo Oakes
8
@BrynnMahsman ES2015 tiene módulos nativos. CommonJS es solo una biblioteca y no tiene nada que ver con el lenguaje.
Kit Sunde
18
Gracias por su respuesta. Entonces, ¿no es un módulo ES6 si no usa las palabras clave de importación / exportación? En este momento estoy usando el Nodo 4 y no tengo acceso para importar / exportar palabras clave y solo estoy usando el módulo CommonJS.exports and require () junto con las funciones ES6 habilitadas de forma predeterminada. Explicaría por qué tengo que poner un uso estricto en la parte superior de cada archivo. Entonces, ¿técnicamente todavía estoy escribiendo módulos CommonJS con algunas características de ES6 habilitadas en V8?
Mayo Oakes
77
Para un examen detallado de "¿es un módulo?" , vea nczonline.net/blog/2016/04/… "... mientras que la presencia de importación o exportación puede indicar un módulo, la falta de importación o exportación no indica claramente que el archivo no es un módulo. Entonces hay "no hay manera efectiva de detectar automáticamente que un archivo es un módulo durante el análisis".
ptim
1
¿Qué es exactamente un "módulo"? Me sale el stricterror (con el preajuste AirBnB ) en un script que consiste solo en "use strict"; console.log('foo'). ¿Eso es un módulo?
Dan Dascalescu