¿Que es Strict Mode? ¿Para que sirve?
¿Como usar Strict Mode?
Para poder utilizarlo lo único que hace falta es escribir 'use strict' al principio del codigo (Ojo! Esto no siempre necesitamos que sea así. Para más detalles leer mas abajo en ¿Donde declarar el contexto?):'use strict'; // Codigo
Pequeño ejemplo:
foo = 5; // foo es una variable global alert(foo);Ver ejemplo en jsfiddle
El codigo de arriba se puede ejecutar sin inconvenientes, pero como muchos saben si no colocamos var al declarar la variable "foo" esta es interpretada como global y en un futuro puede ocasionarnos problemas.
Ahora ¿Qué pasa si colocamos 'use strict' al principio del programa?
'use strict'; foo = 5; alert(foo);
Los invito a que lo comprueben en jsfiddle: Ejemplo cocinado, presionen run y vean que pasa... nada no? Como les dije al principio, usar strict mode evita que ciertas acciones sean tomadas y lanza exepciones al respecto. Si apretamos F12 en la pagina podemos observar que el navegador lanzo una exepción: "Uncaught ReferenceError: foo is not defined" (solo para chrome, el mensaje depende del motor de javascript que tenga el navegador).
Como mencionamos en otro parrafo no siempre necesitamos declarar el contexto al principio del codigo. Strict Mode solo se aplica a scripts enteros o a funciones. En otras palabras si activamos strict mode para todo un script después no hay forma de desactivarlo para una parte especifica del codigo. Como esto puede ser problematico (sobre todo cuando el codigo en el que lo usamos no fue escrito bajo el control de strict mode) es recomendable que se use solamente por funciones. Para hacer esto solo debemos escribir la sentencia 'use strict' al principio de la función y antes de cualquier otra sentencia:
¿Donde declarar el contexto?
(function doSomething(){ // Esta funcion usa strict mode 'use strict'; foo = 5; alert(foo);}()); (function doSomethingElse(){ // Esta funcion no usa strict mode foo = 5; alert(foo);}());
¿Que restricciones aplica?
- Impide crear varaiables globales de forma implicita (como vimos más arriba).
- El uso de eval() no provoca un efecto colateral. Las variables que declaramos dentro de está solo son validas en ese contexto.
- arguments.caller, arguments.calee, Function.arguments y Function caller no se reconocen.
- La sentencia with() tampoco se reconoce.
- this dentro de una funcion no hace mas referencia al objeto windows. Retorna null o undefined.
- Lanza un error al intentar borrar una propiedad no configurable.
- Impide que declaremos un objeto cuyas propiedades tengan el mismo nombre.
Finalmente
La sentencia 'use strict' corre en navegadores viejos (si bien no hace nada, ya que eso depende de la implementacion del motor de javascript).
Si estan interesados en mejorar su codigo javascript los invito a leer nuestro articulo Javascript escribiendo buen codigo.
Referencias:
Mozilla Strict Mode
John Resig ECMAScript 5 Strict Mode, JSON, and More
Raohmaru Use Strict