Maison  >  Article  >  interface Web  >  À propos de la méthode de calcul de la taille de la pile de la pile d'appels de fonction JS

À propos de la méthode de calcul de la taille de la pile de la pile d'appels de fonction JS

不言
不言original
2018-06-29 10:35:532641parcourir

Cet article partage avec vous les points de connaissances pertinents sur la méthode de calcul de la taille de la pile d'appels de fonctions JS. Les amis intéressés peuvent s'y référer.

Si vous écrivez une boucle infinie qui n'arrête pas de s'appeler, félicitations, vous verrez bientôt une erreur : Uncaught RangeError : Taille maximale de la pile d'appels dépassée. Alors, quelle est la taille de la pile d’appels ?

1. Méthode de calcul

La méthode suivante peut calculer pour vous la profondeur dans laquelle l'appel peut être pris en charge par le moteur JavaScript que vous utilisez (inspiré d'un morceau de code par Ben Alman ) :

function computeMaxCallStackSize() {
    try {
      return 1 + computeMaxCallStackSize();
    } catch (e) {
      // Call stack overflow
      return 1;
    }
  }

Les trois résultats suivants sont obtenus en exécutant :

  • Node.js : 11034

  • Firefox : 50994

  • Chrome : 10402

Que font ces les chiffres représentent-ils ? M. Aleph m'a dit que dans la V8, le nombre de couches appelables est basé sur deux aspects : 1. La taille de la pile ; 2. La taille de chaque cadre de pile (utilisé pour enregistrer les paramètres de fonction et les variables locales). Vous pouvez déclarer une variable locale dans calculateMaxCallStackSize pour tester et vous constaterez que le nombre devient plus petit.

2. Optimisation de la récursion de queue dans ECMAScript 6

ECMAScript 6 prend en charge l'optimisation de la récursion de queue : si la dernière opération d'une fonction est un appel de fonction, alors "sauter" être utilisé » au lieu de « sous-appel ». En d’autres termes, si vous réécrivez computingMaxCallStackSize sous la forme suivante, il s’exécutera toujours en mode strict ES6.

function computeMaxCallStackSize(size) {
    size = size || 1;
    return computeMaxCallStackSize(size + 1);
  }

3. Mettre en surbrillance les commentaires

Andrei : La version « ECMAScript 6 » du code ne fonctionne tout simplement pas. ça ne marche pas. Bien que la taille soit modifiée, aucune valeur ne sera finalement renvoyée.

Réponse à Andrei : Intéressant ! Vous ne pouvez pas utiliser ce code pour calculer la taille de la pile. Sous ES6, ce code s'exécutera pour toujours, donc aucune donnée ne sera renvoyée. Dans d'autres cas, RangeError sera renvoyé. Afin que cela fonctionne, j'ai réécrit le code :

var computeMaxCallStackSize = (function() {
 return function() {
  var size = 0;
  function cs() {
   try {
    size++;
    return cs();
   } catch(e) {
    return size + 1;
   }
  }
  return cs();
 };
}());

Ce qui précède est l'intégralité du contenu de cet article, j'espère qu'il vous sera utile. l'étude de tout le monde. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !

Recommandations associées :

jQuery implémente l'obtention d'objets d'étiquette ajoutés dynamiquement

Comment obtenir des données en javascript dans l'applet WeChat

Comment déterminer si l'iframe est chargé via JS

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn