¿Permitiría esto el" uso estricto " globalmente?


Similar, pero no lo mismo que, ¿Cómo habilitar ECMAScript "use strict" globalmente?

He comprado Patrones de JavaScript y recomienda habilitar el uso estricto. Agregarlo a las dos docenas de archivos javascript sería un poco una tarea, por lo que habilitarlo globalmente sería bueno. Originalmente pensé en agregar a la parte superior de mi principal.js como esto:

"use strict" 
require({
    priority: ["jquery", "raphael", "myapp"] 
});

Sin embargo, entonces pensé que tal vez solo lo habilitaría para ese archivo. Entonces pensé en esto:

<script data-main="lib/main" src="lib/require.js">"use strict"</script>

¿Cualquiera de estos habilitaría el modo estricto de ECMAScript 5 globalmente?

Author: Community, 2011-06-26

3 answers

TL; DR :

No, un "use strict" en un elemento script no impone "use strict" al código en otros elementos script. Solo se aplica al texto fuente del que forma parte.

(Por separado, con respecto a la etiqueta script al final de la pregunta: Si un elemento script tiene un src, cualquier texto en línea que tenga se considera "documentación" y se ignora.)


Actualización :

Es más claro en la especificación ahora (tal vez estaba claro en ES5, pero no para mí) que sí, script los elementos separados son separados a los efectos de "use strict". La cita que aparece a continuación en la respuesta original se ha cambiado ligeramente para decir "texto fuente" en lugar de "unidad de código", y la sección Scripts y Módulos entra en más detalle.


Respuesta original :

La especificación dice:

Debido a que el modo estricto se selecciona a nivel de una unidad de código sintáctico, el modo estricto solo impone restricciones que tener efecto local dentro de dicha unidad de código. El modo estricto no restringe ni modifica ningún aspecto de la semántica de ECMAScript que debe funcionar de manera consistente en varias unidades de código.

(Sección 4.2.2)

Así que la pregunta es: ¿Son diferentes script etiquetas diferentes unidades de código sintáctico?

V8 (el motor JavaScript dentro de Chrome) parece creer que están separados y por lo tanto poner un solo "use strict"; en el ámbito global en la parte superior de su página no funcionaría. Tal vez está especificado en algún lugar que aún no he encontrado, pero en cualquier caso, es una interpretación razonable.

Asumiendo que no hay declaración para foo que no se muestra, este código cae presa de El Horror de los Globales Implícitos en modo normal:

function test() {
    try {
      foo = "bar";
      display("foo = " + foo);
    }
    catch (e) {
      display("Exception: " + e);
    }
}

En modo normal, que crea una nueva variable global foo con el valor "bar" y muestra el mensaje "foo = bar". En modo estricto, se lanza una excepción porque foo no está definido.

Si pongo esto etiqueta de script en una página:

<script>
"use strict";
function test() {
    try {
      foo = "bar";
      display("foo = " + foo);
    }
    catch (e) {
      display("Exception: " + e);
    }
}
</script>

...Obtengo la excepción como se esperaba ( ejemplo en vivo). Si los pongo en etiquetas separadas script, sin embargo:

<script>
"use strict";
</script>
<script>
function test() {
    try {
      foo = "bar";
      display("foo = " + foo);
    }
    catch (e) {
      display("Exception: " + e);
    }
}
</script>

I no obtener la excepción (en V8) (ejemplo). Y eso es razonable si piensas en cómo interactúan el navegador y el motor JavaScript.

Y del mismo modo, si la función está desactivada en otro archivo y hago esto:

<script>
"use strict";
</script>
<script src="/inatoq"></script>

No entiendo la excepción (ejemplo), presumiblemente por la misma razón.

Tenga en cuenta que su etiqueta de ejemplo aquí:

<script data-main="lib/main" src="lib/require.js">"use strict"</script>

No es válido. Una etiqueta scriptpuede o bien tener un atributo src o un contenido, pero no ambos. (Bueno, básicamente; detalles aquí [HTML5] y aquí [HTML 4.01].) Si tiene un elemento src, se supone que el navegador no tiene en cuenta el contenido, y la mayoría lo hace. Mas. :-)

 40
Author: T.J. Crowder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-21 08:56:15

JSLint está reportando repentinamente: Use la forma de función de "use strict"

(function () {
    "use strict";
    // put all of your strict code here


}());
 8
Author: Jeremy Bell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:46:57

No, las etiquetas de script se consideran programs y por lo tanto son code units. "use strict" no debe pasar de una etiqueta de script a otra.

Cada etiqueta de script se interpreta individualmente y en realidad tiene su propio ámbito. Este alcance no es notorio ya que todo lo declarado globalmente terminará en el objeto global, pero está ahí sin nada. La cadena "use strict" será basura recolectada al final de la etiqueta program/script ya que no tiene puntero/referencia.

 6
Author: BGerrissen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-26 12:50:25