En fait, vous ne créez pas une fonction récursive là. En invoquant setTimeout
de ses pas s'appelant elle-même plus. La seule fermeture de la créés ici est la fonction anonyme pour setTimeout
, une fois exécuté le garbage collector de reconnaître que la référence à l'instance précédente pouvez obtenir nettoyé. C'est probablement ce qui n'arrivera pas instantanément, mais vous avez vraiment ne pouvez pas créer d' stack overflow
l'aide que. Permet de visualiser cet exemple:
function myFunc() {
var bigarray = new Array(10000).join('foobar');
setTimeout(myFunc, 200);
}
myFunc();
En regardant l'utilisation de la mémoire de votre navigateur. Il va pousser constamment, mais après un certain temps (20 à 40 secondes pour moi) il va avoir complètement nettoyé de nouveau. D'autre part, si nous créons un véritable récursivité comme ceci:
function myFunc() {
var bigarray = new Array(10000).join('foobar');
myFunc();
}
myFunc();
Notre utilisation de la mémoire va croître, les navigateurs se verrouille et nous avons finalement créer qu' stack overflow
. Javascript ne pas mettre en œuvre la Queue de la récursivité, donc on va se retrouver avec un dépassement de capacité dans tous les cas.
mise à jour
cela y ressemblait comme je me suis trompé dans mon premier exemple. Ce comportement est vrai uniquement si aucune fonction-le contexte est appelé (à l'aide d'une fonction anonyme, par exemple). Si nous ré-écriture qui, comme
function myFunc() {
var bigarray = new Array(10000).join('foobar');
setTimeout(function() {
myFunc();
}, 200);
}
myFunc();
Navigateur de mémoire ne semble pas sortir plus. Grandit jamais. C'est peut-être que tout intérieure-closured conserve une référence à l' bigarray
. Mais de toute façon.