Modulos
La manera el la que mas se usan los cierres en javascript es el patron de modulos. Los modulos permite inmplemetar detalles privados (variables, funciones) que estan ocultos para el exterior, al igula que una API publica que es eccesible desde afuera.
Considere:
function User(){
var username, password;
function doLogin(user,pw) {
username = user;
password = pw;
// haz el resto para el login
}
var publicAPI = {
login: doLogin
};
return publicAPI;
}
// crea una instancia del modulo `User`
var fred = User();
fred.login( "fred", "12Battery34!" );
La funcion User()
sirve como un ambito externo que contiene las variables username
y password
y tambien la funcion interna doLogin()
; esos son todas los detalles privados internos de este modulo User
que no pueden ser accedidos desde afuera.
Atencion aqui no estamos llamando new User()
a proposito, a pesar del hecho de que probablemente sea lo mas comun para los lectores User()
es tan solo una funcion, no una clase para ser instanciada, asi que es llamada normalmente. Usar new
seria inapropiado y actualmente gastaria recursos.
Ejecutar User()
crea un instancia del modulo User
-- un nuevo ambito es creado, y asi una nueva copia de cada una de la variables/funciones internas. Asignamos esta instancia a fred
. Si corremos User()
de nuevo, obtendriamos una nueva instancia completamente independiente de fred
.
La funcion interna doLogin()
tiene un ambito sobre username
y password
, lo que significa que esta retendra el acceso de estas variables incluso despues de que la funcion User()
halla terminado de correr.
PublicAPI
es un objeto que contiene una propiedad/metodo, login
, que es una referencia a la funcion interna doLogin()
. Cuando retornamos publicAPI
desde User()
, esta se convierte en una instancia la cual es llamada fred
.
En este punto, la funcion externa User()
ha termindo de ejecutarse. Por lo general, usted pensara que los valores internos de las variables, como username
y password
se han perdido. Pero aqui no lo han hecho, ya que hay un cierre en la funcion login()
que las mantiene vivas.
Es por eso que podemos llamar fred.login()
-- es igual que llamar la funcion interna doLogin()
-- y esta puede continuar teniendo acceso a las variables internas username
y password
.
Hay una buena posibilidad de que tan solo con esta breve ilustracion de un cierre y el patron de modulo, algo de esto continue siendo confuso. Esta bien, toma algo de trabajo para que su cerebro se adapte a ello.