javascript strict-mode

¿Debo ''usar estricto'' para cada función javascript que escribo?



innertext (4)

¿Debo ''usar estricto'' para cada función javascript que escribo?

¿Cuál es una buena práctica para utilizar de forma estricta en un gran proyecto de AngularJS? El uso global puede romper una biblioteca de terceros que no lo admite, pero hacer ''uso estricto'' cada vez es solo una repetición.


En esta pregunta, tenga cuidado con la tendencia general a simplificar en exceso.

Primero, todo el código debe ejecutarse en modo estricto. La funcionalidad de javascript moderno central se cambia (vea .call () y apply () ) o se desfigura ( errores silenciosos ) al ejecutar código fuera del modo estricto. (Más sobre esto here , de Crockford.)

Sin embargo, eso no explica cómo debe asegurarse de que su código se ejecute en modo estricto. Hay al menos dos contextos a considerar:

En el navegador , su código debe ser entregado después de ser minificado. Si incluye ''use strict'' en cada cuerpo de función, su minificador no lo eliminará, y perderá bytes repitiéndolo en todas partes. Solo lo necesita en el (los) ámbito (s) de su función más externa: en la parte superior de las definiciones de sus módulos. Un enfoque es envolver su código minificado en un solo cierre IIFE como parte del proceso de construcción:

;(function (){ ''use strict'' // All code here. }())

Creo que esto se acerca a la forma ideal de hacerlo, pero más o menos dicta que adopte un flujo de trabajo de integración continuo (ya que, para observar que su código se ejecuta en modo estricto, debe tenerlo todo cerrado en un solo cierre). . Si no trabaja de esa manera, deberá incluir la directiva de use strict en la parte superior de cada función que no se declare dentro del alcance de otra función.

En el servidor , es mucho más simple, por supuesto. El código no está reducido y los bytes no importan, por lo que puede incluir la directiva de use strict en la parte superior de cada archivo.

Una advertencia en --use_strict : en los casos en los que controla cómo se ejecutan los scripts, es posible que se --use_strict tentado a usar el --use_strict tiempo de ejecución --use_strict . Es fácil, pero significa que todas las dependencias deben cumplir con el modo estricto. Dado que no puede controlar el cumplimiento de todos los terceros, esto suele ser imprudente.


No. La redundancia no es necesaria. Uso de la declaración.

"use strict";

en el archivo o el alcance de la secuencia es preferible, especialmente si se utilizan bibliotecas de terceros. Ayuda a decidir si usarlos como están, envolverlos o dejar de usarlos.

Funciones de ejecución automática de nivel de archivo

Es cada vez más común ver archivos completos o secuencias en cierres de ejecución automática. En tales casos, la declaración de usar el modo estricto (arriba) se inserta en la primera línea del cierre, donde ... es.

(function () { ... }())

Puede ser útil mencionar que la autoejecución no siempre es necesaria y puede causar cargas lentas y otros problemas si se usa en exceso.

Más sobre el alcance de la declaración

El alcance de depende de si coloca la declaración dentro o fuera de una función y se aplica a todas las declaraciones que siguen a la declaración dentro del alcance del cierre.

El uso de la declaración dentro de la función es la forma incorrecta de hacerlo si todos los archivos o secuencias ya son compatibles con el modo más estricto o se pueden hacer con facilidad. La redundancia es innecesaria, por lo que el uso recomendado es colocar la declaración en la parte superior del archivo o al principio de la secuencia.

A veces solo algunas de las funciones cumplen con las reglas más estrictas. En tales casos, el alcance de función menos deseable de la declaración se puede utilizar para fomentar prácticas de codificación más finas al menos en las funciones que ya cumplen.

¿Por qué el modo estricto en absoluto?

El modo estricto elimina ciertas características permisivas de análisis y ejecución del lenguaje que se consideran menos deseables desde el punto de vista del diseño del lenguaje. Estas características de lenguaje de modo no estricto se consideraron prudentes como comportamiento predeterminado para la compatibilidad con versiones anteriores. La sinopsis y los detalles aparecen aquí.

No se define de manera inequívoca cuándo y si estas características de lenguaje más antiguas de los primeros días de Netscape serán obsoletas o si el modo estricto se convertirá en un comportamiento predeterminado en los navegadores en algún momento, pero es probable que el modelo más estricto produzca una fuente menos ambigua y arriesgada. Si desea mejorar la capacidad de mantenimiento, la portabilidad y la extensibilidad en la práctica de codificación y las bases de código, el modo estricto es una buena opción.

NOTA Para aquellos que vienen aquí de "¿Cuál es la ventaja de usar" la función () ''usar estricto'' "en cada archivo?

Puedes colocar

"use strict";

en la parte superior de la secuencia de códigos o dentro de la función, por lo que es solo una línea de código por archivo o por función.

Las otras líneas de código tienen otros propósitos en el código aquí .

  • Función auto-invocadora
  • Invocación de fábrica

Algunos colocan el archivo completo en una función autoejecutable, pero eso no es necesario en todos los casos.


Respuesta corta, si! No es necesario que lo incluya para cada función, sino que puede agregarlo una vez por archivo de JavaScript. Cuando inicie el archivo, comience con un cierre como este:

(function () { "use strict"; // Rest of your code. })();


Todo el código que escriba 1 should estar en modo estricto . Le ayuda a detectar errores al no ignorar las excepciones.

Sin embargo, no , esto no significa que deba anteponer "use strict"; para cada definición de function , solo debe colocarlo en el alcance del módulo, una vez por archivo, para que sea heredado por todas sus funciones. Cuando vayas a cambiar a módulos ES6 , de todos modos estará implícito .

1: Incluso abogo por habilitarlo globalmente, ya que el modo estricto no debe romper ningún código escrito correctamente.
Si rompe un script de un tercero, la solución podría no ser volver a desactivar el modo estricto ...