what the statement script node missing form es6 enable javascript strict-mode

javascript - the - ¿Qué es el "modo estricto" y cómo se usa?



use the function form of use strict (8)

Estuve revisando la referencia de JavaScript en Mozilla Developer Network, y encontré algo llamado "strict mode" . Lo leí y estoy teniendo problemas para entender lo que hace. ¿Puede alguien explicar brevemente (en general) cuál es su propósito y cómo es útil?


ECMAScript 5 introdujo el concepto de modo estricto .

Invocando el modo estricto en el código

El modo estricto se aplica a scripts completos o a funciones individuales. No se aplica a la instrucción de bloque incluida en {} llaves, al intentar aplicarla a dichos contextos no hace nada.

Guión completo:

Digamos que estamos creando app.js, por lo que al agregar el primer script de uso de declaraciones se aplicará el modo estricto para todo el código.

// app.js whole script in strict mode syntax “use strict”; // Now you can start writing your code

Modo estricto para la función:

Para invocar el modo estricto para una función, ponga la declaración exacta "use strict"; en el inicio del cuerpo de la función antes de cualquier otra declaración.

function yourFunc(){ "use strict"; // Your function code logic }

El modo estricto incorpora varios cambios a la semántica de Javascript normal. El primer modo estricto elimina algunos errores silenciosos de JavaScript al cambiarlos para arrojar errores.

Por instancia: Código que usa el modo estricto

En el ejemplo de código anterior sin usar el modo estricto en el código No arrojará un error. Como estamos accediendo a la variable x sin declararla. Entonces, en modo estricto, acceder a la variable no declarada genera un error.

Ahora intentemos acceder a la variable x sin declararla sin modo estricto.

(function(){ x = 3; })(); // Will not throw an error

Ventaja de usar el modo estricto:

  • Elimine los errores silenciosos de JavaScript lanzando un error.
  • Repara errores que dificultan que el motor de JavaScript realice la optimización.
  • Haga que el código se ejecute más rápido en algún momento que el código idéntico que no está en modo estricto
  • Prohíbe cierta sintaxis que probablemente se definirá en la versión futura de ECMAScript.

2017 y finalmente encontré la documentación:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode

El modo estricto es una forma de optar por una variante restringida de JavaScript. El modo estricto no es solo un subconjunto: intencionalmente tiene una semántica diferente del código normal. Los navegadores que no admitan el modo estricto ejecutarán un código de modo estricto con un comportamiento diferente de los navegadores que sí lo hacen, por lo que no confíe en el modo estricto sin la función de prueba para el soporte de los aspectos relevantes del modo estricto. El código de modo estricto y el código de modo no estricto pueden coexistir, por lo que los scripts pueden optar por el modo estricto de forma incremental.


El modo estricto realiza varios cambios a la semántica normal de JavaScript. Primero, el modo estricto elimina algunos errores silenciosos de JavaScript al cambiarlos para lanzar errores. En segundo lugar, el modo estricto corrige los errores que dificultan que los motores de JavaScript realicen optimizaciones: a veces se puede hacer que el código de modo estricto se ejecute más rápido que el código idéntico que no es el modo estricto. En tercer lugar, el modo estricto prohíbe cierta sintaxis que pueda definirse en futuras versiones de ECMAScript.


El modo estricto realiza varios cambios a la semántica normal de JavaScript.

  • el modo estricto elimina algunos errores silenciosos de JavaScript al cambiarlos para lanzar errores.

  • El modo estricto corrige los errores que dificultan que los motores de JavaScript realicen optimizaciones.

  • el modo estricto prohíbe cierta sintaxis que pueda definirse en versiones futuras de ECMAScript.


Se agregó el modo estricto para que exista un subconjunto fácilmente analizable estadísticamente de EcmaScript, que sería un buen objetivo para futuras versiones del lenguaje. El modo estricto también se diseñó con la esperanza de que los desarrolladores que se limitan al modo estricto cometan menos errores y que los errores que cometen se manifiesten de formas más obvias.

Harmony , que con suerte se convertirá en la próxima versión principal de EcmaScript, se construirá sobre estricto ES5.

Harmony se basa en el modo estricto ES5 para evitar demasiados modos.

Algunos otros experimentos de lenguaje también dependen del modo estricto. SES depende de la capacidad analizable del modo estricto de ES5.

Experimento de diseño SES (Secure ECMAScript)

Diseñe un lenguaje de programación de capacidad de objetos eliminando o reparando características en ES5 / Strict.

Debería haber una traducción directa de SES a ES5 / Strict.

El Anexo C de la norma explica las diferencias entre el modo estricto y el modo normal.

La restricción de modo estricto y excepciones

  • Los identificadores "implementa", "interfaz", "dejar", "paquete", "privado", "protegido", "público", "estático" y "rendimiento" se clasifican como tokens FutureReservedWord dentro del código de modo estricto. (7.6.12 [?]).
  • Una implementación conforme, al procesar código de modo estricto, no puede extender la sintaxis de NumericLiteral (7.8.3) para incluir OctalIntegerLiteral como se describe en B.1.1.
  • Una implementación conforme, al procesar código de modo estricto (ver 10.1.1), no puede extender la sintaxis de EscapeSequence para incluir OctalEscapeSequence como se describe en B.1.2.
  • La asignación a un identificador no declarado o una referencia no resuelta de otro modo no crea una propiedad en el objeto global. Cuando se produce una asignación simple dentro del código de modo estricto, LeftHandSide no debe evaluar a una referencia no resuelta. Si lo hace, se lanza una excepción ReferenceError (8.7.2). LeftHandSide tampoco puede ser una referencia a una propiedad de datos con el valor de atributo {[[Writable]]: false}, a una propiedad de acceso con el valor de atributo {[[Set]]: undefined}, ni a un inexistente propiedad de un objeto cuya propiedad interna [[Extensible]] tiene el valor falso. En estos casos, se lanza una excepción TypeError (11.13.1).
  • El identificador eval o argumentos pueden no aparecer como LeftHandSideExpression de un operador de Asignación (11.13) o de PostfixExpression (11.3) o como UnaryExpression operado por un operador de Incremento de Prefijo (11.4.4) o un Operador de Decreto de Prefijo (11.4.5) . Los objetos Arguments para funciones de modo estrictas definen propiedades de acceso no configurables llamadas "caller" y "callee" que lanzan una excepción TypeError en el acceso (10.6).
  • Los objetos de argumento para funciones de modo estrictas no comparten dinámicamente sus valores de propiedad indexados de matriz con los correspondientes enlaces de parámetros formales de sus funciones. (10.6). Para las funciones de modo estrictas, si se crea un objeto de argumentos, la vinculación de los argumentos de identificador local con el objeto de argumentos es inmutable y, por lo tanto, puede no ser el objetivo de una expresión de asignación. (10.5).
  • Es un SyntaxError si el código de modo estricto contiene un ObjectLiteral con más de una definición de propiedad de datos (11.1.5). Es un SyntaxError si el identificador "eval" o el identificador "argumentos" ocurre como el identificador en un PropertySetParameterList de un PropertyAssignment que está contenido en un código estricto o si su FunctionBody es un código estricto (11.1.5).
  • El código de evaluación de modo estricto no puede instanciar variables o funciones en el entorno variable de la persona que llama a eval. En su lugar, se crea un nuevo entorno variable y ese entorno se utiliza para la creación de instancias vinculantes de declaración para el código eval (10.4.2).
  • Si esto se evalúa dentro del código de modo estricto, este valor no se coacciona con un objeto. A este valor de nulo o indefinido no se convierte en el objeto global y los valores primitivos no se convierten en objetos de envoltura. Este valor pasado a través de una llamada a función (incluidas las llamadas realizadas con Function.prototype.apply y Function.prototype.call) no obliga a pasar este valor a un objeto (10.4.3, 11.1.1, 15.3.4.3, 15.3. 4.4).
  • Cuando se produce un operador de eliminación dentro del código de modo estricto, se lanza un SyntaxError si su expresión Unary es una referencia directa a una variable, argumento de función o nombre de función (11.4.1).
  • Cuando se produce un operador de eliminación dentro del código de modo estricto, se lanza un TypeError si la propiedad que se va a eliminar tiene el atributo {[[Configurable]]: falso} (11.4.1). Es un SyntaxError si una VariableDeclaration o VariableDeclarationNoIn ocurre dentro de un código estricto y su Identificador es eval o arguments (12.2.1).
  • El código de modo estricto puede no incluir un WithStatement. La aparición de un WithStatement en dicho contexto es un SyntaxError (12.10).
  • Es un SyntaxError si se produce un TryStatement con un Catch dentro de un código estricto y el identificador de la producción de Catch es eval o arguments (12.14.1)
  • Es un SyntaxError si el identificador eval o arguments aparece dentro de FormalParameterList de un modo estricto FunctionDeclaration o FunctionExpression (13.1)
  • Una función de modo estricta puede no tener dos o más parámetros formales que tengan el mismo nombre. Un intento de crear una función de este tipo utilizando un constructor FunctionDeclaration, FunctionExpression o Function es un SyntaxError (13.1, 15.3.2).
  • Una implementación no puede extenderse, más allá de lo definido en esta especificación, los significados dentro de las funciones de modo estricto de propiedades denominadas llamadas o argumentos de instancias de función. El código de ECMAScript no puede crear o modificar propiedades con estos nombres en objetos de función que corresponden a funciones de modo estrictas (10.6, 13.2, 15.3.4.5.3).
  • Es un SyntaxError para usar dentro del código de modo estricto los identificadores eval o los argumentos como el Identificador de una FunctionDeclaration o FunctionExpression o como un nombre de parámetro formal (13.1). Intentar definir dinámicamente una función de modo tan estricta utilizando el constructor de Funciones (15.3.2) generará una excepción SyntaxError.

Su objetivo principal es hacer más control.

Solo agregue "use strict"; en la parte superior de tu código, antes que nada.

Por ejemplo, blah = 33; es JavaScript válido Significa que creas una variable completamente global blah .

Pero en modo estricto es un error porque no usaste la palabra clave "var" para declarar la variable.

La mayoría de las veces no se pretende crear variables globales en medio de un alcance arbitrario, por lo que la mayoría de las veces que blah = 33 está escrito, es un error y el programador en realidad no quería que fuera una variable global , tenían la intención de escribir var blah = 33 .

Igualmente, no permite muchas cosas que son técnicamente válidas de hacer. NaN = "lol" no produce un error. Tampoco cambia el valor de NaN. el uso estricto de esto (y declaraciones extrañas similares) produce errores. La mayoría de la gente aprecia esto porque no hay ninguna razón para escribir NaN = "lol" , por lo que es muy probable que haya un error tipográfico.

Lea más en la página de MDN en modo estricto


Un aspecto del modo estricto que ya no se menciona en la respuesta de Simon es que el modo estricto establece this como undefined en las funciones invocadas a través de la invocación de funciones.

Entonces cosas como esta

function Obj() { this.a = 12; this.b = "a"; this.privilegedMethod = function () { this.a++; privateMethod(); }; function privateMethod() { this.b = "foo"; } }

causará un error cuando se privateMethod (ya que no puede agregar una propiedad a undefined ), en lugar de agregar inútilmente una propiedad b al objeto global.


ECMAScript5 presenta algunos objetos y propiedades nuevos y también el llamado "strict mode" .

El modo estricto es un subconjunto del lenguaje que excluye las características en desuso. El modo estricto es opcional y no es obligatorio, lo que significa que si quieres que tu código se ejecute en el modo estricto, declaras tu intención usando (una vez por función o una vez para todo el programa) la siguiente cadena:

"use strict";


Pregunta:
A continuación está el problema que encontré, estaba siguiendo un tutorial y terminó tratando de compilar el siguiente archivo scss y tratando de generar código CSS a partir de él,

.fatty{ width: percentage(6/7); }

usando la siguiente tarea de gulpfile.js :

var gulp = require(''gulp''); var sass = require(''gulp-sass''); gulp.task(''sass'', function () { return gulp.src(''app/scss/styles.scss'') .pipe(sass()) .pipe(gulp.dest(''app/css'')) });

Entonces el error que estoy obteniendo es el siguiente:

~/htdocs/Learning/gulp1/node_modules/gulp-sass/index.js:66 let sassMap; ^^^ SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode at exports.runInThisContext (vm.js:53:16) at Module._compile (module.js:373:25) // stacktrace here...

Solución:
Entonces me muestra el archivo index.js que está dentro de mi módulo gulp-sass (que básicamente está bloqueado y no debe editarse). Pero si voy enérgicamente y agrego el "use_strict" en la parte superior de ese archivo index.js , ejecuta mi tarea sin problemas.

Estaba indefenso, ¡así que sigo usando esto como la solución! Pero después de pasar por otras preguntas y respuestas de SO , vi la siguiente respuesta de la siguiente manera:

sudo npm install -g n sudo n stable

y antes actualicé mis NodeJs (a Version10.x), y luego reconstruí Gulp ejecutando los siguientes comandos como Terminal me indicó:

npm rebuild node-sass --force

Y todo está bien. Así que así es como se resolvió. Deshice los cambios que hice para index.js gulp module file. Y ahora funciona sin problemas.

Espero que esta respuesta sea útil para alguien allá afuera.