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!