¿qué es el "modo estricto" y cómo se usa?


He estado revisando la referencia de JavaScript en la Red de Desarrolladores de Mozilla, y me encontré con algo llamado "strict mode". Lo leí y tengo problemas para entender lo que hace. ¿Puede alguien explicar brevemente (en general) cuál es su propósito y cómo es útil?

Author: danwellman, 2011-12-28

8 answers

Su propósito principal es hacer más comprobaciones.

Simplemente agregue "use strict"; en la parte superior de su código, antes de cualquier otra cosa.

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

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

La mayor parte del tiempo no se pretende crear variables globales en medio de algún ámbito arbitrario, por lo que la mayor parte del tiempo blah = 33 es escrito es un error y el programador no quería que fuera una variable global, querían escribir var blah = 33.

De manera similar, no permite muchas cosas que son técnicamente válidas para hacer. NaN = "lol" no produce un error. Tampoco cambia el valor de NaN. el uso de strict this (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 lo más probable es que haya un error tipográfico.

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

 142
Author: Simon Sarris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-30 14:16:26

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

Así que 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 llame a privateMethod (ya que no puede agregar una propiedad a undefined), en lugar de agregar inútilmente una propiedad b al objeto global.

 33
Author: Adam Rackis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-28 03:34:20

Se agregó el modo estricto para que hubiera un subconjunto fácilmente analizable estáticamente de ECMAScript que sería un buen objetivo para futuras versiones del lenguaje. El modo estricto también fue diseñado con la esperanza de que los desarrolladores que se limitan al modo estricto cometieran menos errores y que los errores que cometen se manifestaran de maneras más obvias.

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

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 de análisis del modo estricto ES5.

Experimento de Diseño SES (Secure ECMAScript)

Diseñe un Lenguaje de Programación de Capacidades de Objetos eliminando o reparando características en ES5/Strict.

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

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 "implements", "interface", "let", "package", "private", "protected", "public", "static" y "yield" 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 amplíe 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 a una referencia irresoluble de otro modo no crea una propiedad en el objeto global. Cuando una asignación simple ocurre dentro de un código de modo estricto, su lado izquierdo no debe evaluarse como una Referencia irresoluble. Si lo hace se lanza una excepción ReferenceError (8.7.2). El lado izquierdo también puede no ser una referencia a una propiedad de datos con el atributo value {[[Writable]]:false}, a una propiedad accessor con el atributo value {[Set]]:undefined}, ni a una propiedad inexistente de un objeto cuya propiedad interna [[Extensible]] tiene el valor false. En estos casos se lanza una excepción TypeError (11.13.1).
  • El identificador eval o argumentos puede no aparece como la expresión izquierda de un operador de Asignación (11.13) o de una Expresión Postfix (11.3) o como la expresión Unary operada por un operador de Incremento de Prefijo (11.4.4) o Decremento de Prefijo (11.4.5). Argumentos los objetos para funciones de modo estricto definen propiedades de accesor no configurables llamadas " caller "y" callee " que lanzan una excepción TypeError en access (10.6).
  • Argumentos los objetos para funciones de modo estricto no comparten dinámicamente su matriz indexada valores de propiedad con los correspondientes enlaces de parámetros formales de sus funciones. (10.6). Para las funciones de modo estricto, si se crea un objeto arguments, el enlace de los argumentos del identificador local al objeto arguments 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 cualquier propiedad de datos (11.1.5). Es un SyntaxError si el Identificador "eval" o el Identificador "argumentos" ocurre como el Identificador en una lista Propertysetparameterl de una asignación de propiedad que está contenida en strict code o si su FunctionBody es strict code (11.1.5).
  • El código de evaluación de modo estricto no puede instanciar variables o funciones en el entorno de variables de la persona que llama a la evaluación. En su lugar, se crea un nuevo entorno variable y ese entorno se utiliza para la instanciación vinculante de declaraciones para el código eval (10.4.2).
  • Si esto se evalúa dentro del código de modo estricto, entonces este valor no es coaccionado a un objeto. A este valor de null o undefined no se convierte en el objeto global y los valores primitivos no se convierten en objetos wrapper. Este valor se pasa a través de una llamada a función (incluidas las llamadas realizadas mediante Función.prototipo.aplicar y Funcionar.prototipo.call) no coaccionar el paso de este valor a un objeto (10.4.3, 11.1.1, 15.3.4.3, 15.3.4.4).
  • Cuando un operador delete ocurre dentro de un código de modo estricto, un SyntaxError se lanza si su UnaryExpression es una referencia directa a una variable, argumento de función, o nombre de función(11.4.1).
  • Cuando se produce un operador delete dentro de un código de modo estricto, se lanza un TypeError si la propiedad a eliminar tiene el atributo { [[Configurable]]:false } (11.4.1). Es un SyntaxError si una VariableDeclaration o Variabledeclarationoin 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 Resistencia. La ocurrencia de un Witstatement en tal contexto es un SyntaxError (12.10).
  • Es un SyntaxError si un TryStatement con un Catch ocurre 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 una lista FormalParameterList de un modo estricto FunctionDeclaration o FunctionExpression (13.1)
  • Una función de modo estricto no puede tener dos o más parámetros formales que tienen el mismo nombre. Un intento de crear una función de este tipo usando un FunctionDeclaration, FunctionExpression, o un constructor de función es un SyntaxError (13.1, 15.3.2).
  • Una implementación no puede extender, más allá de lo definido en esta especificación, significados dentro de funciones de modo estricto de propiedades llamadas llamador o argumentos de instancias de función. El código ECMAScript no puede crear ni modificar propiedades con estos nombres en objetos de función que correspondan al modo estricto funciones (10.6, 13.2, 15.3.4.5.3).
  • Es un SyntaxError usar dentro del código de modo estricto los identificadores eval o arguments 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 estricto usando el constructor de función (15.3.2) lanzará una excepción SyntaxError.
 21
Author: Mike Samuel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-28 03:28:38

ECMAScript 5 introdujo el concepto de modo estricto .

Invocando el Modo Estricto en Código

El modo estricto se aplica a scripts enteros o a funciones individuales. No se aplica a la instrucción block encerrada entre llaves {}, intentar aplicarla a tales contextos no hace nada.

Guión completo:

Digamos que estamos creando la aplicación.js por lo que la adición de la primera instrucción use script hará cumplir el modo estricto para toda codificar.

// 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 instrucción exacta "use strict"; en el inicio del cuerpo de la función antes de cualquier otra instrucción.

function yourFunc(){
 "use strict";

 // Your function code logic
}

El modo estricto incorpora varios cambios a la semántica normal de Javascript. El primer modo estricto elimina algunos errores silenciosos de JavaScript cambiándolos para lanzar errores.

Por Ejemplo: Código usando Modo Estricto

introduzca la descripción de la imagen aquí

En ejemplo de código anterior sin usar el modo estricto en el código no lanzará un error. Como estamos accediendo a variable x sin declararla. Así que en modo estricto el acceso a la variable no declarada arroja 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 error.
  • Corrige errores que dificultan que el motor JavaScript realice la optimización.
  • Hacer 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 alguna sintaxis que probablemente se defina en una versión futura de ECMAScript.
 6
Author: Nishant Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-01 06:06:33

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

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

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

  • El modo estricto prohíbe alguna sintaxis que probablemente se defina en futuras versiones de ECMAScript.

 5
Author: Renganathan M G,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-27 12:14:20

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

El modo estricto es un subconjunto del lenguaje que excluye entidades obsoletas. El estricto el modo es opt-in y no es obligatorio, lo que significa que si desea que su código se ejecute en el modo estricto, usted declara su intención usando (una vez por función, o una vez para el programa completo) la siguiente cadena:

"use strict";
 1
Author: hallaji,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-15 11:31:06

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 diferentes semántica del código normal. Los navegadores que no soportan el modo estricto ejecutar código de modo estricto con un comportamiento diferente de los navegadores que lo hacen, por lo no confíe en el modo estricto sin pruebas de características para apoyo a la aspectos relevantes del modo estricto. Código de modo estricto y modo no estricto el código puede coexistir, por lo que los scripts pueden optar por el modo estricto de forma incremental.


El modo estricto realiza varios cambios en 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 dificultar que los motores JavaScript realicen optimizaciones: código de modo estricto puede a veces se hacen para correr más rápido que idénticos código que no es modo estricto. Tercero, el modo estricto prohíbe alguna sintaxis es probable que se defina en futuras versiones de ECMAScript.

 0
Author: Tilak Maddy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-14 16:19:57

Pregunta:
El siguiente es 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 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'))
});

Así que 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:
Así que 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 con fuerza y agregue el "use_strict" en la parte superior de ese archivo index.js, ejecuta mi tarea sin problemas.

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

sudo npm install -g n
sudo n stable

Y antes actualizé mis NodeJS (a la Versión10.x), y luego reconstruyó Gulp ejecutando los siguientes comandos como Terminal me indicó:

npm rebuild node-sass --force

Y todo está bien. Así es como se resolvió. Deshice los cambios que hice por index.js gulp archivo del módulo. Y ahora funciona sin problemas.

Espero que esta respuesta sea útil para alguien por ahí!

 0
Author: Randika Vishman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-13 04:49:53