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 originalvar mifuncion = function(param){
var private = function(foo){
return param + ', ' + foo;
}
return private;
}
//¡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 originalvar hola = mifuncion('Hello');
console.log(hola);
//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 originalconsole.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 originalconsole.log(mifuncion('Hello')('World')); //Hello, World
Espero te sirva este aporte, un abrazo.