Foros del Web » Programando para Internet » Javascript »

Alguien puede explicarme como funciona esto? (Closures¿?)

Estas en el tema de Alguien puede explicarme como funciona esto? (Closures¿?) en el foro de Javascript en Foros del Web. Buenas a todos, Estoy realizando ejercicios javascript y me he encontrado con esto: answers.functionFunction = function(param){ var function = function(foo){ return param + ', ' ...
  #1 (permalink)  
Antiguo 18/09/2012, 08:40
 
Fecha de Ingreso: marzo-2012
Ubicación: Barcelona
Mensajes: 52
Antigüedad: 12 años, 2 meses
Puntos: 6
Alguien puede explicarme como funciona esto? (Closures¿?)

Buenas a todos,

Estoy realizando ejercicios javascript y me he encontrado con esto:


answers.functionFunction = function(param){


var function = function(foo){

return param + ', ' + foo;

}

return function;

}

answers.functionFunction('Hello')('world');

El resultado es "Hello,world"

La cuestión es que no entiendo la llamada a la funcion functionFunction. ¿Alguien puede echarme una mano?

Gracias!
  #2 (permalink)  
Antiguo 18/09/2012, 10:37
Avatar de cristian_cena
Colaborador
 
Fecha de Ingreso: junio-2009
Mensajes: 2.244
Antigüedad: 14 años, 10 meses
Puntos: 269
Respuesta: Alguien puede explicarme como funciona esto? (Closures¿?)

No se de donde viene answer por tanto cambié un poco el código para que quede más legible. Se desaconseja usar "palabras reservadas del lenguaje" para darle nombre a las cosas:
Código Javascript:
Ver original
  1. var mifuncion = function(param){
  2.     var private = function(foo){
  3.         return param + ', ' + foo;
  4.     }
  5.     return private;
  6. }
  7. //¡usa highlight por favor!
Una función anidada conserva la visibilidad a las variables de su(s) funcion(es) padre, pero no al revés. Ejemplo: mifuncion() ve solo a param, pero private() ve a param y a foo. Este artículo sobre closures está muy bueno y te va a explicar el tema mil veces mejor que yo.

Cuando antepones var a un identificador (de variable o función) dentro de una función, estas diciendo que ese identificador es local a esa función y que por tanto no podrá ser accedido desde afuera de esa función, Aquí podrías leer sobre "scope" o "ámbito", "variables locales y globales".

mifuncion() a traves de return devuelve el contenido de su identificador local private (si quieres puedes ver a private como un método privado). Observa que return está devolviendo una función, porque en javascript una función puede retornar otra función (una función en javascript es un objeto, una instancia de Function).

Ejemplo:
Código Javascript:
Ver original
  1. var hola = mifuncion('Hello');
  2. console.log(hola);
  3. //console.log(mifuncion('Hello'));
Línea 1: declaramos la variable hola y dentro llamamos a mifuncion(), la que al ejecutarse hace que hola sea la función contenida en private
Línea 2: imprimirmos la variable para comprobar que definitivamente contiene (es el identificador de) una función.
Línea 3: hacemos lo mismo sin usar la variable hola

ok, ¿que ocurre de maravilloso aca? que la función contenida en hola sigue accediendo a param. Por lo tanto:
Código Javascript:
Ver original
  1. console.log(hola('World')); //Hello, World
Otra forma de imprimir lo mismo sería con la notación que expusiste, que para serte sincero, no la conocía, ojalá alguien nos enseñe a ambos sobre esto:
Código Javascript:
Ver original
  1. console.log(mifuncion('Hello')('World')); //Hello, World
Espero te sirva este aporte, un abrazo.

Última edición por cristian_cena; 18/09/2012 a las 18:33
  #3 (permalink)  
Antiguo 18/09/2012, 15:04
 
Fecha de Ingreso: marzo-2012
Ubicación: Barcelona
Mensajes: 52
Antigüedad: 12 años, 2 meses
Puntos: 6
Respuesta: Alguien puede explicarme como funciona esto? (Closures¿?)

Infinitas gracias Cristian, muy bien explicado y gran aporte ;)

Etiquetas: funcion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:53.