Archivo etiqueta var

Closures en JavaScript. Patrón Modulo

Si hace un tiemplo comentaba que en JavaScript el patrón singleton es implícito, voy a revisar otro patrón que sirve para modularizar nuestro código. Las clausuras de JavaScript o Closure es algo que tiene que conocer cualquiera que se dedique en profundidad a este lenguaje.

Closures
Una closure es en definitiva un objeto que es definido e instanciado en el momento de su declaración. Así hay que tener en cuenta que esta metodología cumple el patron modulo, al declarar el módulo, y el singleton, ya que no permite reinstanciaciones del mismo objeto porque se declara y se ejecuta.

var clos = (function(){

	var vprivada=999; // solo accesible desde esta closure

	function fprivada(param){
		vprivada=param;
	}

	var prop={};
	prop.funcion=function(){
		document.write("123456789");
	}
	prop.variable=119;

	return prop;

}());

Como la función es ejecutada al mismo tiempo que es declarada es necesario devolver el objeto que se genera dentro de ella. Si no asignamos la función a nada la closure es anónima, pero no deja de ejecutarse por ello.

Aumentar la closure
Para ampliar las propiedades de nuestro objeto podemos escribir otra closure y asignársela, el problema es que si lo hacemos sin más perdemos las propiedades anteriores, por eso debemos pasarle por parámetro todo el código anterior, es decir, la misma closure.

var clos=(function(prop2){

	prop2.funcion2=function(){
		document.write("999888777");
	}
	prop2.variable2=219;

	return prop2;
}(clos));

En caso de que no exista podemos crear una nueva closure al vuelo para evitar los errores de ejecución.

var clos=(function(prop){

	...

	return prop;
}( clos|| {} ));

De esta manera podemos distribuir nuestro código entre distintos archivos en caso de que fuese necesario. En una página donde tengamos implementadas pocas funcionalidades esto no es necesario, pero cuando va creciendo la cantidad de cosas que queremos hacer con JavaScript, modularizar el código de esta manera resulta bastante útil.

También es importante saber que podemos extender nuestra closure con otras para hacerla más rica. Así incorporando librerías de terceros (como jQuery) podemos personalizar el producto a nuestras necesidades. Esto podria considerarse un tipo de herencia implicita, para ver la herencia explicita aquí.

Ya he visto que en ciertos perfiles laborales se indica explícitamente el conocimiento de closures. Cuando estamos programando en paralelo con un compañero de trabajo y se dividen las funcionalidades a programar, debe de hacerse con aumentos de closures, que hace fácil unificar el código y también puede permitir acotar a la hora de buscar fallos.

, , , , , , ,

No hay Comentarios

Sintaxis JavaScript: var = function

Hace ya tiempo que abandoné JavaScript por otros lenguajes “más potentes” pero la curiosidad y firebug para firefox me la han recordado.

Me llama la funcion las formas en las que se puede delcarar una funcion en javascript. Hay que decir que en este lenguaje, en el que ningun desarrollador cumple el estandar, todo es un poco de todo.

En los lenguajes debilmente tipados las variables (var a;) pueden ser entero, float, string o cualquier otra cosa, su tipado es tan debil que ni siquiera es necesario declarar las variables con la palabra reservada var.

La definicion de una funcion tipica en JS es la siguiente:

function product(a,b){
   return a*b;
}

document.write(product(5,6));

Como ya hemos dicho JS es debilmente tipado, y una variable puede ser de cualquier tipo. En JS pueden ser incluso funciones. Así que podemos indicar que una variable es igual a una funcion con su declaracion de parámetros y las instrucciones entre llaves:

product= function(a,b){
   return a*b;
}

document.write(product(5,6));

Podemos indicar que es una variable con var o no, funcionará de todos modos.

var product= function(a,b){
   return a*b;
}

document.write(product(5,6));

En JavaScript este concepto se puede abstraer más y le podemos asignar a una variable distintos componentes siendo estos funciones. Los que sepan C no les sesultará esto muy distinto a un struct pero con funciones, en definitiva un objeto como los de C++.

mat= {
   product: function(a,b){
      return a*b;
   }
}

document.write(mat.product(5,6));

Para incluir varios elementos los separamos por comas:

var mat= {
   product: function(a,b){
      return a*b;
   },
   sum: function(a,b){
      return a+b;
   },
}

document.write(mat.product(5,6));
document.write(mat.sum(5,6));

Conceptualmente esto tambien es un array, aunque un array siendo puristas se declararía con corchetes en este caso se declara con llaves y se asocia un nombre a cada posición. El siguiente codigo tambien funcionaria aunque la invocacion sea algo diferente:

var mat = [1,2,function(){return 3;}];
document.write(mat[0]);
document.write(mat[1]);
document.write(mat[2]());

Hay que tener cuidado a la hora de invocar a las funciones. Como vemos las del ejemplo anterior tienen parametros y al incluir los parentesis son invocadas como funciones, pero al ser una variable de cualquier tipo podemos invocar funciones, no como su resultado, si no como el texto que está escrito en ellas. En wl siguiente código vemos dos variables y una función dentro del objeto

var mat = {
a:1,
b:2,
c: function(){return 3;},
}

Ejecutando esta llamada

document.write(mat.b+" "+mat.a+" "+mat.c());

obtenemos:

2 1 3

Pero si el elemento c no es invocado como función, es decir sin parametros:

document.write(mat.b+" "+mat.a+" "+mat.c);

obtenemos:

2 1 function(){return 3;}

Así nos responde con el texto que está asociado al elemento c, ya que sin parámetros no lo considera una función. En determinados casos no es así, de modo que hay que tener cuidado cuando se invoca una función con parámetros o sin ellos.

No es cuestion de ir declarando objetos por gusto, pero esto si que nos puede dar mucha potencia a la hora de montarnos una biblioteca potente donde todo esté empaquetado en un objetos. Por ejemplo para las comunicaciones asincronas (Ajax) lo suyo es montarse un objeto que haga todo lo que queramos y despues llamarlo desde Html. Hay que decri que para el caso de Ajax ya hay muchas bibliotecas hechas, así que si te quieres hacer una por practicar está bien, pero lo usual es utilizar una ya hecha y muy provada.

Strings en JavaScrit: métodos Quirksmode.org

Como consulta: muy básico w3schools.com

Al final en JavaScript parace que todo es un poco todo a la vez, por eso para programar directamente en JS hay que aceptar que según la vision del programador las funciones y las variables a veces son lo mismo.

, ,

1 Comentario