modo estricto se aplica al contexto de ejecución en el que se declaró y todos los contextos ese contexto contiene (con un poco de squidginess alrededor de contextos creados a través de eval
, pero evitar el uso de eval
y evitar la squidginess), por lo general tendrá que utilizar el patrón de módulo para aplicarla a todo el código:
(function() {
"use strict";
function foo() {
}
function bar() {
}
// ...presumably code hooking up `foo` and `bar` to events
// or otherwise using them -- or of course, you could export
// them from the scope...
})();
En el modo anterior, el estricto se aplica no sólo a la función anónima, pero a foo
y bar
también. Así, por ejemplo, donde el código sería "trabajo" (crear una variable global a través de The Horror of Implicit Globals):
(function() {
function foo() {
someNameThatIsntDefined = 42; // Blech, creates implicit global
}
foo();
})();
... este código falla con un ReferenceError
(el único cambio es el "use strict"
):
(function() {
"use strict";
function foo() {
someNameThatIsntDefined = 42; // Throws ReferenceError
}
foo();
})();
... porque una de las muchas cosas útiles que hace el modo estricto es deshacerse del horror de los globales implícitos.
Aquí hay otro ejemplo, donde se exportan una función que se ejecuta en modo estricto, incluso cuando se llama desde código no estricto:
var MyModule;
MyModule = MyModule || {};
(function(mod) {
"use strict";
mod.doSomethingUseful = doSomethingUseful;
function doSomethingUseful() {
// ...
}
})(MyModule);
código "suelta" puede llamar MyModule.doSomethingUseful
, que siempre se ejecuta en modo estricto. El resultado es que puede aplicar el modo estricto a su código sin requerir que todos usando su código también lo use. Muy útil, eso.
Gracias por la edición, Matt! Hago eso (cadena en lugar de estricto) mucho ... :-) –