Maison > interface Web > js tutoriel > le corps du texte

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

不言
Libérer: 2018-06-29 10:35:53
original
2678 Les gens l'ont consulté

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;
    }
  }
Copier après la connexion

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);
  }
Copier après la connexion

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();
 };
}());
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal