Si j'essaye
var count = 0 function recurse() { count++ ( new Function( recurse.toString().split('\n').splice(1, 2).join('\n') ) )() } try { recurse() } catch(e) { console.log(e.message, count) }
, le résultat est La taille maximale de la pile d'appels dépasse 15662
, mais si j'essaye
var count = 0 function recurse() { count++ recurse() } try { recurse() } catch(e) { console.log(e.message, count) }
alors le résultat est La taille maximale de la pile d'appels dépasse 8862
.
Pourquoi les nombres sont-ils différents?
3 Réponses :
Ah, d'après http://2ality.com/2014/04 /call-stack-size.html ,
le nombre d'appels récursifs que vous pouvez effectuer dépend de deux quantités: la taille de la pile et la taille du cadre de la pile (contenant les paramètres et les variables locales).
En raison de la pile n'appartiennent pas exclusivement à votre programme.
Par exemple, lorsque votre programme est en cours d'exécution, il peut être géré par interruption asynchrone, ou votre tâche peut être suspendue par le planificateur et le processeur basculé vers une autre tâche. Si tel est le cas, le contexte actuel (registres, PSW) de votre tâche a été enregistré dans la pile et repris lorsque vous avez repris le contrôle.
Par conséquent, la consommation de pile peut être variable et toutes les valeurs sous le pointeur de pile (SP) ne sont pas définies. Et si vous enregistrez quelque chose sous SP, pas un fait, vous lirez la même chose.
Parce que dans le premier scénario, la taille de chaque appel récursif est plus petite. le quotient (taille de la pile / taille de l'appel de fonction sur la pile) est plus grand.