Strict Mode en Javascript

martes, 30 de julio de 2013


¿Que es Strict Mode?   ¿Para que sirve?

Strict Mode es una funcionalidad de ECMAScript 5 que sirve para hacer que una parte del programa funcione bajo un contexto estricto. Este contexto previene de que ciertas acciones sean tomadas y lanza excepciones al respecto. En otras palabras nos ayuda a cometer menos errores cuando escribimos código en javascript.

¿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).

¿Donde declarar el contexto?

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:
 
 (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.