ด้วยความอยากรู้อยากเห็น แต่ยังไม่สามารถหาคำตอบสำหรับหัวข้อประสิทธิภาพของคำถามข้างต้นได้ฉันจึงเขียนส่วนสำคัญนี้สำหรับ nodejs เพื่อทดสอบทั้งประสิทธิภาพและความน่าเชื่อถือของโซลูชันที่นำเสนอ (และคะแนน) ทั้งหมด
ฉันได้เปรียบเทียบเวลาผนังของการสร้างฟังก์ชันโคลนและการดำเนินการของโคลน ผลลัพธ์พร้อมกับข้อผิดพลาดในการยืนยันจะรวมอยู่ในความคิดเห็นของส่วนสำคัญ
บวกสองเซ็นต์ของฉัน (ตามคำแนะนำของผู้เขียน):
โคลน 0 เซ็นต์ (เร็วกว่า แต่น่าเกลียดกว่า):
Function.prototype.clone = function() {
var newfun;
eval('newfun=' + this.toString());
for (var key in this)
newfun[key] = this[key];
return newfun;
};
โคลน 4 เซ็นต์ (ช้ากว่า แต่สำหรับผู้ที่ไม่ชอบ eval () สำหรับวัตถุประสงค์ที่รู้จักกันเฉพาะพวกเขาและบรรพบุรุษของพวกเขา):
Function.prototype.clone = function() {
var newfun = new Function('return ' + this.toString())();
for (var key in this)
newfun[key] = this[key];
return newfun;
};
สำหรับประสิทธิภาพหาก eval / new Function ช้ากว่า wrapper solution (และขึ้นอยู่กับขนาดตัวของฟังก์ชันจริงๆ) มันจะทำให้คุณสามารถโคลนฟังก์ชันเปล่า (และฉันหมายถึงโคลนตื้นที่แท้จริงที่มีคุณสมบัติ แต่ไม่ได้แบ่งใช้) โดยไม่มีฟัซที่ไม่จำเป็น ด้วยคุณสมบัติที่ซ่อนอยู่ฟังก์ชัน Wrapper และปัญหาเกี่ยวกับสแต็ก
นอกจากนี้ยังมีปัจจัยสำคัญอย่างหนึ่งที่คุณต้องคำนึงถึงเสมอนั่นคือยิ่งรหัสน้อยตำแหน่งที่ผิดพลาดก็จะน้อยลง
ข้อเสียของการใช้ฟังก์ชัน eval / new คือโคลนและฟังก์ชันเดิมจะทำงานในขอบเขตที่แตกต่างกัน ฟังก์ชันนี้ใช้ไม่ได้กับฟังก์ชันที่ใช้ตัวแปรที่กำหนดขอบเขต โซลูชันที่ใช้การห่อแบบผูกเป็นขอบเขตโดยไม่ขึ้นกับ