2011-12-28 27 views
121

He estado 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?¿Qué es el "modo estricto" y cómo se usa?

+1

relacionadas: http://stackoverflow.com/q/1335851/1461424 – Krumia

Respuesta

135

Su objetivo principal es hacer más comprobaciones.

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

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

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

mayoría de las veces que no quieres decir para crear variables globales en el medio de un cierto margen arbitraria, por lo que la mayor parte del tiempo en que se escribe blah = 33 es un error y el programador en realidad no quiere que se ser una variable global, significaron escribir var blah = 33.

Igualmente 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 estricto de esto (y declaraciones extrañas similares) produce errores. La mayoría de las personas aprecia esto porque no hay ninguna razón para escribir NaN = "lol", por lo que es muy probable que haya un error tipográfico. se añadió

Read more at the MDN page on strict mode

+4

esto es un duplicado exacto de la documentación sobre al MDN – nkcmr

+23

es lo que no entiende acerca de su utilidad, entonces? Su objetivo es ayudar al desarrollo mediante la captura de cosas que son válidas, pero más probables, errores. –

20

modo estricto por lo que no habría un subconjunto fácilmente analizables de manera estática-EcmaScript que sería un buen objetivo para las futuras versiones de la lengua. 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 que 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.

SES (Secure ECMAScript) Diseño Experimental

Diseño de un objeto Capacidad de lenguaje de programación mediante la eliminación o la reparación de características en ES5/estricto.

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

Annex C del estándar explica las diferencias entre el modo estricto y el modo normal.

La restricción de modo estricto y excepciones

  • los identificadores "implementos", "interfaz", "dejar", "paquete", "privado", "protegido", "público", "estáticas ", 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 extender la sintaxis de NumericLiteral (7.8.3) para incluir OctalIntegerLiteral como se describe en B.1.1.
  • Una implementación conforme, al procesar el 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 Incremento de Prefijo (11.4.4) o un Decreto de Prefijo (11.4. 5) operador. Los argumentos de los objetos para las funciones de modo estrictas definen las propiedades de acceso no configurables llamadas "caller" y "callee" que emiten una excepción TypeError en el acceso (10.6).
  • Los argumentos de objetos 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 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 propiedad de datos (11.1.5). Es un SyntaxError si el identificador "eval" o los "argumentos" del identificador se producen como el identificador en una PropertySetParameterList de una PropertyAssignment contenida 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 crear una instancia de 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 a 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 un TryStatement con una captura se produce dentro estricto código y el identificador de la producción Catch es eval o argumentos (12.14.1)
  • Es un SyntaxError si el eval identificador o argumentos aparece dentro de un FormalParameterList de una estricta FunctionDeclaration modo 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 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 las propiedades llamadas llamante 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 utilizar en el código modo estricto los identificadores eval o 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.
28

Un aspecto de modo estricto no ya se ha 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 la función.

cosas, así como este

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

    function privateMethod() { 
    this.b = "foo"; 
    } 
} 

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

+4

sí, necesito agregar 'privateMethod.bind (this)();' y llamar con 'new' [' jsbin.com'] (https://jsbin.com/foyomo/edit?html,js,console) – hlcs

5

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

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

  • modo estricto corrige errores que hacen que sea difícil para los motores de JavaScript para realizar optimizaciones.

  • modo estricto prohíbe una sintaxis probable que se define en las futuras versiones de ECMAScript.

1

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

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

"use strict"; 
6

ECMAScript 5 introdujo el concepto de modo estricto.

La invocación de modo estricto en el Código

modo estricto se aplica a la totalidad de las secuencias de comandos o función individual. 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 añadir primer script uso declaración hará cumplir el modo estricto para código completo.

// 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, poner 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 Javascript normal. El primer modo estricto elimina algunos errores silenciosos de JavaScript al cambiarlos para arrojar errores.

Por ejemplo: Código utiliza el modo estricto

enter image description here

En ejemplo de código anterior sin utilizar el modo estricto en el código no generará un error. Como estamos accediendo a la variable x sin declararlo. 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 utilizar el modo estricto:

  • Eliminar errores de JavaScript silenciosas por error de tiro.
  • Corrige un error que dificulta la optimización del motor de JavaScript.
  • 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 el modo estricto
  • Prohíbe cierta sintaxis que pueda definirse en la versión futura de ECMAScript.
0

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

modo estricto es una manera de optar por una variante restringida de JavaScript. El modo estricto no es solo un subconjunto: intencionalmente tiene una semántica diferente de del código normal. Los navegadores que no admitan el modo estricto ejecutarán el código de modo estricto con un comportamiento diferente al de los navegadores que sí lo hacen, por lo que no dependen del 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.


modo estricto hace varios cambios en la semántica JavaScript normales. Primero, el modo estricto elimina algunos errores silenciosos de JavaScript por cambiándolos para arrojar errores. Segundo, el modo estricto corrige errores que dificultan que los motores de JavaScript realicen optimizaciones: el código de modo estricto a veces puede ejecutarse más rápido que el código idéntico que no es el modo estricto. En tercer lugar, el modo estricto prohíbe la sintaxis que probablemente se definirá en futuras versiones de ECMAScript.

Cuestiones relacionadas