คุณอยากรู้ว่าเครื่องยนต์ JavaScript สามารถโทรซ้ำได้หรือไม่?
จำนวนการโทรซ้ำ
ฟังก์ชั่นต่อไปนี้ช่วยให้คุณค้นหาคำตอบ: (ได้รับแรงบันดาลใจจากส่วนสำคัญของ Ben Alman)
การคัดลอกรหัสมีดังนี้:
function computemaxcallstacksize () {
พยายาม {
return 1 + computemaxcallstacksize ();
} catch (e) {
// โทรหาสแต็คล้น
กลับ 1;
-
-
สามผลลัพธ์:
การคัดลอกรหัสมีดังนี้:
node.js: 11034
Firefox: 50994
Chrome: 10402
ตัวเลขเหล่านี้เป็นตัวแทนอะไร? Mr. Aleph ชี้ให้เห็นว่าใน V8 จำนวนการเรียกซ้ำขึ้นอยู่กับสองปริมาณ: ขนาดของสแต็กและขนาดของเฟรมสแต็ก (ตัวแปรท้องถิ่นที่เก็บพารามิเตอร์) คุณสามารถตรวจสอบได้ว่าโดยการเพิ่มตัวแปรโลคัลใน ComputemaxCallstackSize () - มันส่งคืนค่าต่ำ
การเพิ่มประสิทธิภาพการโทรหางใน ecmascript 6
ES6 มีการเพิ่มประสิทธิภาพการโทรหาง: หากขั้นตอนสุดท้ายในฟังก์ชั่นเป็นฟังก์ชั่นการโทรก็จะ "กระโดด" แทนที่จะถูกเรียกโดยฟังก์ชั่นย่อย ซึ่งหมายความว่าใน ES6 (โหมดที่เข้มงวด) คุณเพียงแค่ต้องเปลี่ยนฟังก์ชั่น computemaxCallStackSize เล็กน้อยและสามารถดำเนินการได้ตลอดไป
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่น computemaxcallstacksize (ขนาด) {
ขนาด = ขนาด || 1;
ส่งคืน computemaxcallstacksize (ขนาด + 1);
-