هل أنت فضولي بشأن عدد المكالمات العودية التي يمكن إجراءها بواسطة محرك JavaScript؟
كم عدد المكالمات العودية
تتيح لك الوظيفة التالية العثور على الإجابة: (مستوحاة من GIST Ben Alman)
نسخة الكود كما يلي:
وظيفة computemaxcallstacksize () {
يحاول {
إرجاع 1 + computemaxCallStackSize () ؛
} catch (e) {
// مكدس مكدس الفائض
العودة 1 ؛
}
}
ثلاث نتائج:
نسخة الكود كما يلي:
Node.js: 11034
Firefox: 50994
Chrome: 10402
ماذا تمثل هذه الأرقام؟ أشار السيد أليف إلى أنه في V8 ، يعتمد عدد المكالمات العودية على كميتين: حجم المكدس وحجم إطار المكدس (المتغير المحلي الذي يحمل المعلمات). يمكنك التحقق من أنه بإضافة المتغيرات المحلية في ComputemaxCallStackSize () - فإنه يعيد قيمة منخفضة.
تحسين مكالمة الذيل في ecmascript 6
لدى ES6 تحسين مكالمات الذيل: إذا كانت الخطوة الأخيرة في وظيفة ما هي أيضًا استدعاء دالة ، فسيتم "قفز" بدلاً من أن يتم استدعاؤها بواسطة وظيفة فرعية. هذا يعني أنه في ES6 (الوضع الصارم) ، تحتاج فقط إلى تغيير وظيفة ComputemaxCallStackSize قليلاً ، ويمكن تنفيذها إلى الأبد.
نسخة الكود كما يلي:
وظيفة computemaxcallstacksize (الحجم) {
الحجم = الحجم || 1 ؛
إرجاع computemaxCallStackSize (حجم + 1) ؛
}