statement que node missing es6 javascript scope ecma262 strict ecmascript-5

javascript - que - use strict node



En ECMAScript5, ¿cuál es el alcance del "uso estricto"? (4)

¿Qué alcance tiene el modo estricto pragma en ECMAScript5?

"use strict";

Me gustaría hacer esto (principalmente porque JSLint no se queja):

"use strict"; (function () { // my stuff here... }());

Pero no estoy seguro si eso rompería otro código o no. Sé que puedo hacer esto, que abarcará el pragma a la función ...

(function () { "use strict"; // my stuff here... }());

pero JSLint se queja de ello (cuando la opción JSLint "estricta" está habilitada) porque cree que estás ejecutando código antes de habilitar "uso estricto".

Aquí está mi pregunta Si tengo fileA.js:

"use strict"; // do some stuff

y fileB.js:

eval( somecodesnippet ); // disallowed by "use strict"

y luego incluirlos en mi página html en el mismo orden, ¿se pragma alcance el archivo, o el pragma sangrar en fileB, lo que bloquea la ejecución eval?


El archivo completo:

<script...> "use strict";

o

Toda la función y sus funciones embebidas, por ejemplo:

function fn(){ "use strict";


"use strict" aplica solo a la función o al alcance del programa. Entonces, si tiene fileA.js con "use strict" en la parte superior, fileA.js se ejecuta en modo estricto, y todas las funciones definidas en él harán lo mismo cuando se le llame. Pero fileB.js es un programa separado, por lo que el "use strict" de fileA.js no se aplica a él, y por lo tanto fileB.js se ejecutará en modo no estricto. (Por supuesto, si somecodesnippet comienza con una directiva de "use strict" y analiza correctamente, ese código se ejecutará en modo estricto, y las funciones definidas por ese código harán lo mismo.) La estricción no "sangra" en absoluto, y por ES5 4.2 .2 (admitidamente no normativo, pero estoy seguro de que podría extraer una referencia normativa para esto si fuera necesario), "una implementación debe admitir la combinación de unidades de código de modo estricto y sin restricciones en un solo programa compuesto".

Una de las cuestiones a tener en cuenta es que si usas el modo estricto en el ámbito global algunas veces pero no siempre, ya no puedes concatenar tus scripts en un solo archivo. Supongamos que tiene los guiones A, B, C, D en ese orden. Si A es estricto, la concatenación total será estricta, ¡incluso si B / C / D no! Por el contrario, si A no es estricto (y no está vacío), la concatenación general no será estricta, incluso si B / C / D fuera estricto. Esto ya ha mordido al menos un sitio de usuarios iniciales.

Dicho todo esto, el modo estricto no prohíbe la eval . Cuando eval se llama de la manera normal en modo estricto, utilizando la sintaxis de programa de la forma eval(code [, ...]) , es una evaluación "directa" que se comporta de la manera que eval siempre lo tiene, excepto que el code siempre se evalúa como código de modo estricto, incluso si el code no comienza con una directiva de "use strict" , y salvo que las variables creadas por el código se mantienen en su propio almacenamiento separado de las variables existentes. (La semántica exacta es un poco complicada, trabajo en el motor de JavaScript de Firefox, últimamente implementando esto, e incluso después de una buena cantidad de tiempo en la especificación y trabajando en una implementación todavía no es intuitivo para mí).

Si no se llama así: eval.call(...) , setTimeout(eval, ...) , setInterval(eval, ...) , var ev = eval; ev(...); var ev = eval; ev(...); , y así sucesivamente, es una evaluación "indirecta". La evaluación indirecta (ya sea dentro o fuera del modo estricto) se comporta de forma un poco diferente: la resolución del nombre y la definición de la variable se producen como si estuvieran en el ámbito global. (El código se ejecutará como código de modo estricto solo si comienza con una directiva de "use strict" ).

El soporte del modo estricto está casi terminado, pero no del todo, en los últimos nightlies de Firefox , por lo que puede valer la pena descargar uno para jugar con las partes del modo estricto que se implementan. Todavía diría que espere el uso de producción hasta que esté completo, pero definitivamente está listo para la experimentación (siempre y cuando comprenda que el modo estricto todavía no está completo). (En cuanto al enlace de Sean McMillan, tenga en cuenta que sus afirmaciones de "soporte" representan el mínimo extremo de funcionalidad necesario para cada bala. Las pruebas de modo estrictas son mucho mejores, aunque para estar seguro de que no están en ninguna parte cerca de cubrir el modo estricto por completo. )


EDITAR Parece que estaba incorrecto. Por favor, vea la respuesta de Jeff Walden a continuación .

Vea esta respuesta a una pregunta relacionada: ¿Qué hace "use strict" en JavaScript, y cuál es el razonamiento detrás de esto?

A pesar de las quejas de JSLint, puede (y debe ) usar "use strict"; dentro de una función si solo quieres que esa función esté en modo estricto. Si lo usa en el contexto global, forzará que todo su código esté en modo estricto. Respuesta corta: sí, bloqueará el uso de eval .


eval( somecodesnippet ); // disallowed by "use strict"

No si declaras algún código antes.

var somecodesnippet = "su impresionante codensippet aquí";

eval (somecodesnippet); // NO anulado por "uso estricto"