¿Qué hace "uso estricto" en JavaScript, y cuáles son las razones de esto?

Recientemente lancé mi código JavaScript a través de Crockford JSLint y di el siguiente error:

Problema en la línea 1 carácter 1: Falta una declaración de "uso estricto".

Mientras hacía algunas búsquedas, me di cuenta de que algunas personas añaden "use strict"; en su código javascript. Tan pronto como agregué la expresión, el error dejó de aparecer. Desafortunadamente, Google no reveló la mayor parte de la historia de esta línea de operador. Por supuesto, esto debería estar relacionado con la forma en que JavaScript es interpretado por el navegador, pero no sé cuál será el efecto.

Entonces, ¿qué es "use strict"; ¿Todo tiene que ver con lo que esto implica, y sigue siendo relevante?

Cualquier navegador actual responde a "use strict"; cadena o es para uso futuro?

6989
26 авг. conjunto por Mark Rogers 26 ago. 2009-08-26 19:10 '09 a las 19:10 2009-08-26 19:10
@ 30 respuestas

Este artículo sobre el Modo estricto de Javascript puede interesarle: John Resig - Modo estricto ECMAScript 5, JSON y más

Para citar algunas partes interesantes:

El modo estricto es una nueva función en ECMAScript 5 que le permite colocar un programa o función en un contexto de trabajo "estricto". Este contexto estricto evita que se tomen ciertas acciones y lanza más excepciones.

Tambien

El modo estricto ayuda de varias maneras:

  • Atrapa algunos bloopers de codificación comunes, lanzando excepciones.
  • Previene o crea errores cuando se toman acciones relativamente "inseguras" (por ejemplo, obtener acceso a un objeto global).
  • Esto deshabilita las características que son confusas o mal pensadas.

También tenga en cuenta que puede aplicar "modo estricto" a todo el archivo ... O puede usarlo solo para una función específica (aún citando el artículo de John Resig):

 // Non-strict code... (function(){ "use strict"; // Define your library strictly... })(); // Non-strict code... 

¿Qué puede ser útil si necesita mezclar código antiguo y nuevo ;-)

Entonces, supongo que es un poco como "use strict" que puedes usar en Perl (¿de ahí el nombre?): Te ayuda a cometer menos errores al encontrar más cosas que pueden provocar averías.

Actualmente, es compatible con todos los navegadores principales (panel de IE 9 y más abajo).

4587
26 авг. La respuesta la da Pascal MARTIN 26 ago. 2009-08-26 19:15 '09 a las 19:15 2009-08-26 19:15

Esta es una nueva característica de ECMAScript 5. John Resig escribió un buen resumen .

Esta es solo una línea que pones en tus archivos JavaScript (ya sea en la parte superior de tu archivo o dentro de una función), que se ve así:

border=0
 "use strict"; 

Habilitar este código ya no debería causar problemas con los navegadores actuales, ya que esto es solo una cadena. Esto puede causar problemas con su código en el futuro si su código rompe un pragma. Por ejemplo, si actualmente tiene foo = "bar" sin definir primero foo , su código se bloqueará ... lo cual, en mi opinión, es bueno.

1152
26 авг. La respuesta se da seth 26 ago. 2009-08-26 19:14 '09 a las 7:14 p.m. 2009-08-26 19:14

La declaración "use strict"; indica al navegador que use el modo Estricto, que es un conjunto reducido y más seguro de funciones de JavaScript.

Lista de funciones (no exhaustiva)

  1. No permite variables globales. (Elimina las declaraciones y errores tipográficos que faltan en los nombres de variables)

  2. Las tareas fallidas silenciosas causarán un error en modo estricto (asignando NaN = 5; )

  3. Los intentos de eliminar las propiedades tolerantes a errores provocarán ( delete Object.prototype )

  4. Requiere que todos los nombres de propiedad en el literal del objeto sean únicos ( var x = {x1: "1", x1: "2"} )

  5. Los nombres de los parámetros de función deben ser únicos ( function sum (x, x) {...} )

  6. Forbids - sintaxis octal ( var x = 023; algunos desarrolladores creen erróneamente que el cero anterior no hace nada para cambiar el número).

  7. Prohibiendo with palabra clave

  8. eval en modo estricto no introduce nuevas variables

  9. Deshabilitar la eliminación de nombre simple ( delete x; )

  10. Deshabilitar el enlace o la denominación de eval y arguments en cualquier forma

  11. El modo estricto no admite las propiedades del objeto de arguments con parámetros formales. (es decir, en la function sum (a,b) { return arguments[0] + b;} Esto funciona porque los arguments[0] están asociados con a , etc.)

  12. arguments.callee no arguments.callee compatible

[Enlace: Modo Estricto , Red de Desarrolladores de Mozilla]

567
25 нояб. la respuesta es dada por gprasant 25 nov. 2014-11-25 00:22 '14 a las 0:22 2014-11-25 00:22

Si a la gente le preocupa el use strict , es posible consultar este artículo:

Compatibilidad con el modo estricto de ECMAScript 5 en los navegadores. ¿Qué significa esto?
NovoGeek.com - El blog de Krishna

Habla sobre el soporte del navegador, pero lo más importante, cómo manejarlo:

 function isStrictMode(){ return !this; }  function isStrictMode(){ "use strict"; return !this; }  
385
16 июля '12 в 2:25 2012-07-16 02:25 Jamie Hutber da respuesta el 16 de julio de 2012 a las 2:25 a.m. 2012-07-16 02:25

Una advertencia, cualquier cosa que programe con carga dura: ¡aplicar "use strict" al código existente puede ser peligroso! Esta cosa no es un tipo de pegatina feliz y agradable que puedas darle al código para que sea "mejor". Con "use strict" correcto "use strict" pragmas, el navegador repentinamente lanza excepciones en lugares aleatorios que nunca antes había lanzado, simplemente porque en este lugar haces lo que JavaScript permite por defecto / libre, pero no como el JavaScript estricto ! Es posible que tenga infracciones estrictas que están ocultas en las llamadas que se usan raramente a su código, lo que generará una excepción solo cuando se ejecuten en última instancia, por ejemplo, en un entorno de producción que utilizan sus clientes de pago.

Si va a dar un paso decisivo, le recomendamos que utilice el "use strict" junto con las pruebas unitarias completas y la tarea de compilación JSHint estrictamente configurada, que le dará confianza de que no hay una esquina oscura de su módulo que explotará mal porque ha activado el modo estricto. O bien, aquí hay otra opción: simplemente no agregue un "use strict" a ninguno de sus códigos obsoletos, esto es probablemente más seguro y honesto. DEFINITIVAMENTE NO agregue "use strict" para los módulos que no posee o no admite, como los módulos de terceros.

Creo que incluso si es un estómago mortal en una jaula, el "use strict" puede ser bueno, pero hay que hacerlo bien. El mejor momento para ser estricto es cuando tu proyecto es nuevo y comienzas desde cero. Configure JSHint/JSLint con todas las advertencias y opciones plegadas tan fuerte como su equipo pueda hacer una mueca, obtenga un buen sistema de compilación / prueba / aprobación que se pueda configurar como Grunt+Karma+Chai , y solo THEN marcará todos sus nuevos módulos como "use strict" . Esté preparado para curar muchos errores y advertencias. Asegúrese de que todos entiendan la gravedad estableciendo el ensamblaje en FAIL si JSHint/JSLint provoca irregularidades.

Mi proyecto no era un proyecto nuevo cuando adopté "use strict" . Como resultado, mi IDE está lleno de marcas rojas, porque no tengo "use strict" en la mitad de mis módulos, y JSHint se queja de ello. Este es un recordatorio para mí de qué refactorización debo hacer en el futuro. Mi objetivo es ser una marca roja de forma gratuita debido a todas mis declaraciones de "use strict" faltan, pero esto ha sido durante muchos años.

193
03 марта '14 в 10:37 2014-03-03 10:37 La respuesta es dada por DWoldrich el 3 de marzo de 2014 a las 10:37 2014-03-03 10:37

Utilice 'use strict'; No hace que tu código sea mejor.

El modo estricto de JavaScript es una función en ECMAScript 5 . Puede habilitar el modo estricto declarando esto en la parte superior de su script / función.

 'use strict'; 

Cuando el motor de JavaScript vea esta directiva, comenzará a interpretar el código en un modo especial. En este modo, se producen errores cuando se detectan ciertos métodos de codificación que pueden ser errores potenciales (que es un argumento a favor del modo estricto).

Considera este ejemplo:

 var a = 365; var b = 030; 

En su obsesión por construir literales numéricos, el desarrollador inicializó inadvertidamente la variable b octavo literal. Un modo no estricto interpretará esto como un literal numérico con un valor de 24 (en base 10). Sin embargo, el modo estricto causará un error.

Para obtener una lista no exhaustiva de especialidades en modo estricto, consulte Esta respuesta .


¿Dónde debo usar 'use strict'; ?

  • En mi nueva aplicación javascript: ¡Absolutamente! El modo estricto se puede usar como informante cuando haces algo estúpido con tu código.

  • En mi código javascript existente: ¡ Probablemente no! Si su código JavaScript existente contiene instrucciones que están prohibidas en modo estricto, la aplicación simplemente se romperá. Si necesita un modo estricto, debería estar listo para depurar y corregir el código existente. Es por eso que el uso de 'use strict'; No hace que tu código sea mejor.


¿Cómo usar el modo estricto?

  1. Insertar 'use strict'; en la parte superior de su guión:

     // File: myscript.js 'use strict'; var a = 2; .... 

    Tenga en cuenta que todo en myscript.js se interpretará en modo estricto.

  2. O pegar 'use strict'; La declaración sobre las funciones de su cuerpo:

     function doSomething() { 'use strict'; ... } 

    Todo en el ámbito léxico de la función doSomething se interpretará en modo estricto. El área léxica de la palabra es importante aquí. Vea esta respuesta para una mejor explicación.


¿Qué cosas están estrictamente prohibidas?

Encontré un buen artículo que describe varias cosas que están estrictamente prohibidas (tenga en cuenta que esta no es una lista exclusiva):

Volumen

Históricamente, JavaScript se ha confundido acerca de cómo se cubren las funciones. A veces parecen estar capturados estáticamente, pero algunas funciones los obligan a comportarse como si estuvieran cubiertos dinámicamente por una región. Esto es confuso, lo que dificulta la lectura y la comprensión de los programas. El malentendido causa errores. Este es también un problema de rendimiento. Una definición de dominio estático permitiría un enlace variable en tiempo de compilación, pero el requisito de un dominio dinámico significa que el enlace debe aplazarse hasta el tiempo de ejecución, que está asociado con una disminución significativa en el rendimiento.

El modo estricto requiere que todos los enlaces de variables se ejecuten estáticamente. Esto significa que las funciones que anteriormente requerían enlaces dinámicos deben eliminarse o modificarse. En particular, el operador con está excluido y la capacidad de las funciones de evaluación para interferir con el entorno de su interlocutor está estrictamente limitada.

Una de las ventajas del código estricto es que las herramientas como YUI Compressor pueden funcionar mejor en su procesamiento.

Variables globales implícitas

JavaScript implica variables globales. Si no declara explícitamente una variable, una variable global se declara implícitamente para usted. Esto simplifica la programación para los novatos, ya que pueden descuidar algunas de sus principales tareas comerciales. Pero esto dificulta la administración de programas más grandes y reduce significativamente la confiabilidad. Así, en modo estricto, las variables globales implícitas ya no se crean. Debes declarar explícitamente todas tus variables.

Fugas globales

Hay una serie de situaciones que pueden hacer que this se asocie con un objeto global. Por ejemplo, si olvidó proporcionar new prefijo cuando llama a una función constructora, this constructor se asociará inesperadamente con un objeto global, así que en lugar de inicializar un nuevo objeto, falsificará silenciosamente con variables globales. En estas situaciones, el modo estricto en lugar de eso lo une con undefined , lo que hace que el constructor emita una excepción y le permita detectar el error antes.

Error ruidoso

JavaScript siempre tenía propiedades de solo lectura, pero no podía crearlas usted mismo hasta que la función Object.createProperty esté abierta para la función Object.createProperty . Si intentaste asignar un valor a una propiedad de solo lectura, fallará. La asignación no cambiará el valor de la propiedad, pero su programa actuará como si lo fuera. Este es un peligro de integridad, lo que puede llevar a que los programas se vuelvan inconsistentes. En modo estricto, intentar cambiar la propiedad de solo lectura causará una excepción.

octal

La representación de números de 8 bits fue extremadamente útil al realizar la programación de máquinas en máquinas cuyo tamaño de palabra era un múltiplo de 3. Al trabajar con el mainframe CDC 6600, con un tamaño de palabra de 60 bits, necesitaba un número octal. Si pudieras leer octal, podrías ver la palabra como 20 dígitos. Dos dígitos representaron el código de operación y un dígito identificó uno de los 8 registros. Durante la lenta transición de los códigos de máquina a los lenguajes de alto nivel, se consideró útil proporcionar formas octales en los lenguajes de programación.

En C, se eligió la idea extremadamente desafortunada de la octalidad: el cero inicial. Entonces, en C 0100 significa 64, no 100, y 08 es un error, no 8. Incluso más, desafortunadamente, este anacronismo se copió en casi todos los idiomas modernos, incluido JavaScript, donde se usa solo para crear errores. Esto no tiene otro propósito. Así, en modo estricto, las formas octales ya no están permitidas.

Etcétera

Los argumentos de pseudo matriz se vuelven un poco más como matrices en ES5. En modo estricto, pierde las propiedades de la caller y de la caller . Esto le permite pasar sus arguments código no confiable, sin dejar mucho contexto confidencial. Además, se excluye la propiedad de arguments de funciones.

En modo estricto, las claves duplicadas en un literal de función dan un error de sintaxis. El no puede funcionar tiene dos parámetros con el mismo nombre. El no puede funcionar tiene una variable con el mismo nombre que uno de sus parámetros. La función no puede delete tiene sus propias variables. Intentar delete propiedad no configurable ahora lanza una excepción. Los valores primitivos no están envueltos implícitamente.


Palabras reservadas para futuras versiones de javascript

ECMAScript 5 agrega una lista de palabras reservadas. Si los usa como variables o argumentos, el modo estricto generará un error. Palabras reservadas:

implements , interface , let , package , private , protected , public , static y el yield


Lectura adicional

144
29 янв. respuesta dada por sampathsris 29 de enero 2016-01-29 14:35 '16 a las 14:35 2016-01-29 14:35

Recomiendo encarecidamente que todos los desarrolladores comiencen a usar el modo estricto. Hay suficientes navegadores que lo admiten que el modo estricto legalmente nos ayudará a evitar errores que ni siquiera sabíamos que estaban en su código.

Aparentemente, en la etapa inicial habrá errores que nunca hemos encontrado antes. Para obtener el beneficio completo, debemos realizar las pruebas adecuadas después de cambiar al modo estricto para asegurarnos de que todos estamos atrapados. Definitivamente, simplemente no use strict en nuestro código y creemos que no hay errores. Por lo tanto, lo importante es que es hora de comenzar a utilizar esta característica de lenguaje increíblemente útil para escribir un mejor código.

Por ejemplo

 var person = { name : 'xyz', position : 'abc', fullname : function () { "use strict"; return this.name; } }; 

JSLint es un depurador escrito por Douglas Crockford. Solo péguelo en su script, y escanea rápidamente en busca de problemas y errores notables en su código.

128
05 июля '13 в 22:38 2013-07-05 22:38 La respuesta se da a Pank el 5 de julio de 2013 a las 10:38 2013-07-05 22:38

Me gustaría ofrecer una respuesta un poco más fundamentada que complemente las otras respuestas. Esperaba editar la respuesta más popular, pero no pude. Traté de hacerlo lo más completo y completo posible.

Para obtener más información, puede consultar la documentación de MDN .

"use strict" directiva de "use strict" ingresada en ECMAScript 5.

Las directivas son como declaraciones, pero diferentes.

  • use strict no contiene palabras clave: una directiva es una declaración de expresión simple que consiste en un literal de cadena especial (entre comillas simples o dobles). Los motores de JavaScript que no implementan ECMAScript 5 simplemente ven la expresión sin efectos secundarios. Se espera que las versiones futuras de los estándares ECMAScript introduzcan el use como una palabra clave real; Por lo tanto, las citas serán obsoletas.
  • use strict solo se puede usar al principio de un script o función, es decir, Debe preceder a cualquier otra declaración (real). Esta no debe ser la primera instrucción en una secuencia de comandos de función: puede ir precedida por otras expresiones de operador que consisten en cadenas literales (y las implementaciones de JavaScript se pueden ver como directivas específicas de la implementación). Los literales de cadena que siguen al primer operador real (en un script o función) son expresiones simples. Los intérpretes no deben interpretarlos como directivas, y no tienen ningún efecto.

use strict directiva de use strict indica que el siguiente código (en un script o función) es un código estricto. El código en el nivel más alto de la secuencia de comandos (código que no está en la función) se considera un código estricto cuando la secuencia de comandos contiene el use strict directiva de use strict . El contenido de una función se considera código estricto cuando la función en sí está definida en código estricto o cuando la función contiene la directiva de use strict . El código pasado al método eval() se considera un código estricto cuando se llama a eval() desde un código de cadena o contiene la directiva de use strict .

El modo estricto de ECMAScript 5 es un subconjunto limitado del lenguaje JavaScript, que elimina las fallas de idioma correspondientes y proporciona una comprobación de errores más estricta y una mayor seguridad. Las siguientes son las diferencias entre el modo estricto y el modo normal (de los cuales los tres primeros son particularmente importantes):

  • No se puede usar with -statement en modo estricto.
  • En modo estricto, todas las variables deben declararse: si asigna un valor a un identificador que no se ha declarado como una variable, una función, un parámetro de función, un parámetro de cláusula catch o una propiedad de Object global, entonces obtendrá un ReferenceError . В нормальном режиме идентификатор объявляется неявно как глобальная переменная (как свойство глобального Object )
  • В строгом режиме ключевое слово this имеет значение undefined функции, которые были вызываться как функции ( а не как методы). (В нормальном режиме this всегда указывает на глобальный Object ). Это различие можно использовать для проверки, поддерживает ли реализация строгий режим:
 var hasStrictMode = (function() { "use strict"; return this===undefined }()); 
  • Также, когда функция вызывается с call() или apply в строгом режиме, this точно значение первого аргумента call() или apply() . (В нормальном режиме null и undefined заменяются глобальным Object а значения, которые не являются объектами, преобразуются в объекты.)

  • В строгом режиме вы получите TypeError , когда вы пытаетесь назначить свойства readonly или определить новые свойства для не растяжимого объекта. (В обычном режиме оба просто обходятся без сообщения об ошибке.)

  • В строгом режиме при передаче кода в eval() вы не можете объявлять или определять переменные или функции в области вызывающего (как это можно сделать в обычном режиме). Вместо этого для eval() создается новая область, и переменные и функции находятся в пределах этой области. Эта область уничтожается после того, как eval() завершает выполнение.
  • В строгом режиме аргумент-объект функции содержит статическую копию значений, которые передаются этой функции. В нормальном режиме аргумент-объект имеет несколько "магическое" поведение: элементы массива и именованные функциональные параметры ссылаются на одно и то же значение.
  • В строгом режиме вы получите SyntaxError когда за оператором delete следует неквалифицированный идентификатор (переменная, функция или параметр функции). В нормальном режиме выражение delete ничего не сделает и будет оценено как false .
  • В строгом режиме вы получите TypeError при попытке удалить неконфигурируемое свойство. (В обычном режиме попытка просто терпит неудачу, а выражение delete - false ).
  • В строгом режиме это считается синтаксической ошибкой при попытке определить несколько свойств с тем же именем для литерала объекта. (В нормальном режиме ошибки нет.)
  • В строгом режиме это считается синтаксической ошибкой, когда объявление функции имеет несколько параметров с тем же именем. (В нормальном режиме ошибки нет.)
  • В строгом режиме не допускаются восьмеричные литералы (это литералы, начинающиеся с 0x . (В нормальном режиме некоторые реализации позволяют делать восьмеричные литералы).
  • В строгом режиме идентификаторы eval и arguments обрабатываются как ключевые слова. Вы не можете изменить их значение, не можете присвоить им значение, и вы не можете использовать их в качестве имен для переменных, функций, параметров функций или идентификаторов блока catch.
  • В строгом режиме больше ограничений на возможности проверки стека вызовов. arguments.caller и arguments.callee вызывают TypeError в функции в строгом режиме. Кроме того, некоторые свойства caller- и аргументы функций в строгом режиме вызывают TypeError при попытке их прочитать.
88
ответ дан Ely 15 мая '15 в 9:58 2015-05-15 09:58