40 votes

JavaScript: Pourquoi la fermeture n'a-t-elle lieu que si j'attribue la fonction de retour à une variable?

Même après avoir lu Vous ne savez pas JS et JavaScript: Le Cœur , je ne pouvais toujours pas à comprendre le comportement de la suite du code.

Pourquoi, quand je l'appelle counter()(), ne je n'ai pas de fermeture, mais si je assigner une variable à la suite de l' counter(), comme var getClosure = counter(), je puis obtenir une fermeture lors de l'appel d' 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

70voto

Xin Points 5528

_counter est la variable locale dans la fonction counter() . Chaque fois que vous appelez counter() un nouveau _counter sera créé.

Mais var createClosure = counter() n'a appelé que la fonction 1 fois, c'est pourquoi _counter n'est pas nouvellement créé à chaque fois et "mémorisé" là-bas (c'est là que se produit la fermeture)

10voto

Yonggoo Noh Points 668

Chaque fois que vous appelez counter()(), il crée une nouvelle fonction, une nouvelle fermeture. Ainsi, le résultat est toujours 0.

Au contraire, lorsque var createClosure = counter(); est exécutée, une fonction et de fermeture sont créés et enregistrés dans la variable createClosure. La prochaine fois, quand vous appelez createClosure(), le rescapé est invoquée et à la création de la fermeture est utilisé. Par conséquent, les résultats sont 0, 1, 2, 3, ...

1voto

Olubodun Agbalaya Points 120

En d'autres termes, la valeur de retour de la fonction counter() , qui correspond à la fermeture, n'est pas conservée ou est plutôt rejetée lorsque vous appelez simplement la fonction telle quelle.

Cependant, après avoir affecté cette valeur de retour à var createClosure . Vous pouvez appeler la fermeture autant de fois que nécessaire

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X