tipos - pasar variables de una funcion a otra en javascript
JavaScript: ¿Por qué el cierre solo ocurre si asigno la función de retorno a una variable? (3)
Incluso después de leer No sabes JS y JavaScript: el núcleo Todavía no podía entender el comportamiento del siguiente código.
¿Por qué, cuando llamo a counter()()
, no obtengo ningún cierre, pero si asigno una variable al resultado de counter()
, como var getClosure = counter()
, obtengo un cierre al llamar a getClosure()
?
function counter() {
var _counter = 0;
function increase() { return _counter++ }
return increase;
}
// Double ()() to call the returned function always return 0, so no closure.
counter()() // returns 0
counter()() // returns 0
counter()() // returns 0
counter()() // returns 0
var createClosure = counter();
createClosure() // returns 0
createClosure() // returns 1
createClosure() // returns 2
createClosure() // returns 3
Para decirlo de otra manera, el valor de retorno de la función counter()
, que es el cierre, no se conserva o, más bien, se descarta cuando simplemente llama a la función tal como está.
Sin embargo, después de asignar ese valor de retorno a var createClosure
. Usted puede llamar al cierre tantas veces como sea necesario
_counter
es la variable local dentro de la función counter()
. Cada vez que llame a counter()
_counter
un nuevo _counter
.
Pero var createClosure = counter()
solo llamó a la función 1 vez, por eso _counter
no se crea cada vez y se ''recuerda'' allí (ahí es donde ocurre el cierre)
Cada vez que llama a counter()()
, crea una nueva función y un nuevo cierre. Entonces el resultado es siempre 0
.
Por el contrario, cuando var createClosure = counter();
se ejecuta, se crean una función y un cierre y se guardan en la variable createClosure
. La próxima vez que llame a createClosure()
, se invocará el guardado y se usará el cierre creado. Por lo tanto los resultados son 0
, 1
, 2
, 3
, ...