ES6 (แรงบันดาลใจจากคำตอบของ sendy halim ด้านล่าง):
myFunction.name
ชี้แจง MDN ตั้งแต่ปี 2015 ใช้งานได้ใน nodejs และเบราว์เซอร์หลักทั้งหมดยกเว้น IE
หมายเหตุ: ในฟังก์ชั่นที่ถูกผูกไว้สิ่งนี้จะให้ " bound <originalName>
" คุณจะต้องตัด "ผูกพัน" ถ้าคุณต้องการได้รับชื่อเดิม
ES5 (แรงบันดาลใจจากคำตอบของ Vlad):
หากคุณมีการอ้างอิงถึงฟังก์ชั่นคุณสามารถทำ:
function functionName( func )
{
// Match:
// - ^ the beginning of the string
// - function the word 'function'
// - \s+ at least some white space
// - ([\w\$]+) capture one or more valid JavaScript identifier characters
// - \s* optionally followed by white space (in theory there won't be any here,
// so if performance is an issue this can be omitted[1]
// - \( followed by an opening brace
//
var result = /^function\s+([\w\$]+)\s*\(/.exec( func.toString() )
return result ? result[ 1 ] : '' // for an anonymous function there won't be a match
}
- ฉันไม่ได้ใช้การทดสอบหน่วยในเรื่องนี้หรือตรวจสอบความแตกต่างของการใช้งาน แต่โดยหลักการแล้วมันควรจะใช้ได้ถ้าไม่แสดงความคิดเห็น
- หมายเหตุ: จะไม่ทำงานกับฟังก์ชั่นที่ถูกผูกไว้
- หมายเหตุ: ที่
caller
และcallee
จะถือว่าเลิก
[1] ฉันรวมมันไว้ที่นี่เพราะมันถูกกฎหมายและบ่อยครั้งที่เครื่องมือการเน้นไวยากรณ์ไม่เพียงพอที่จะคำนึงถึงช่องว่างสีขาวระหว่างชื่อฟังก์ชันและวงเล็บ ในทางกลับกันฉันไม่ได้ตระหนักถึงการใช้. toString () ใด ๆ ที่จะรวมพื้นที่สีขาวที่นี่ด้วยเหตุนี้คุณจึงสามารถละเว้นได้
ตามคำตอบของคำถามดั้งเดิมฉันจะทิ้งมรดกของกาฝากและไปหารูปแบบการออกแบบ OOP แบบดั้งเดิม ฉันเขียนTidBits.OoJsเพื่อเขียนรหัส OOP ใน JavaScript อย่างสะดวกสบายด้วยชุดคุณสมบัติที่เลียนแบบ C ++ (ยังไม่เสร็จสมบูรณ์ แต่ส่วนใหญ่)
ฉันเห็นจากความคิดเห็นที่คุณต้องการหลีกเลี่ยงการส่งผ่านข้อมูลที่parent
จำเป็นในการสร้างมัน ฉันต้องยอมรับว่ารูปแบบการออกแบบดั้งเดิมจะไม่ช่วยให้คุณประหยัดจากรูปแบบนั้นได้เนื่องจากโดยทั่วไปถือว่าเป็นสิ่งที่ดีที่จะทำให้การอ้างอิงของคุณชัดเจนและถูกบังคับใช้
ฉันอยากจะแนะนำให้หลีกเลี่ยงฟังก์ชั่นนิรนาม พวกเขาทำการดีบักและสร้างโปรไฟล์ PITA เพียงเพราะทุกอย่างแสดงเป็น "ฟังก์ชันที่ไม่ระบุชื่อ" และไม่มีประโยชน์สำหรับพวกเขาที่ฉันรู้