"use strict"
se aplica solo a la función o al alcance del programa. Por lo tanto, 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 "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 "use strict"
y se 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 según ES5 4.2.2 (ciertamente no normativo, pero estoy seguro de que podría desenterrar 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".
Esto se debe a esto: si utiliza el modo estricto en el ámbito global a veces pero no siempre, ya no puede concatenar sus 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 eval
.Cuando se llama eval
de la manera normal en modo estricto, usando la sintaxis de programa del formulario eval(code [, ...])
, es una evaluación "directa" que se comporta de la manera en que eval
siempre tiene - excepto que code
siempre se evalúa como código de modo estricto, incluso si code
doesn ' Comenzar con una directiva "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 soy intuitivo).
Si no se llama así - eval.call(...)
, setTimeout(eval, ...)
, setInterval(eval, ...)
, var ev = eval; ev(...);
, etc. - 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á código de modo tan estricto sólo si se comienza con una directiva "use strict"
.)
compatibilidad con el modo estricto está casi - pero no del todo - terminada en el último Firefox nightlies, por lo que puede valer la pena la descarga de uno a jugar alrededor con esas 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.)
lado A Nota: la presentación de Douglad Crockford sobre "El estado y el futuro de Javascript fue realmente genial. Habla sobre algunas de las nuevas características, como estricto al final de la charla. Aquí está el enlace: http://www.infoq.com/presentations/The-State-and-Future-of-JavaScript –
'eval()' está permitido con '" use strict "', solo obtiene un alcance global. –