Anonymous Functions (ฟังก์ชันไร้ชื่อ) เหมาะสำหรับ:
- Inline Handlers/Callbacks: โค้ดอ่านง่ายเมื่อ Handler อยู่ในที่เรียกใช้
- IIFE: สร้าง Scope แยกกัน
- Arguments ให้ Higher-Order Functions: map, filter, reduce, forEach, setTimeout
- Closure: จับตัวแปรจาก Scope รอบนอก
รูปแบบ
// Anonymous Function Expression
var func = function() {
alert('This is anonymous');
};
func();
// Arrow Function (ES6) - กระชับกว่า
const func = () => alert('This is anonymous');
// ใช้เป็น Callback โดยตรง
setTimeout(function() { console.log('Later'); }, 1000);
setTimeout(() => console.log('Later'), 1000);
array.forEach(function(item) { ... });
array.forEach(item => ...);
ข้อดี
- เข้าถึงตัวแปรใน Parent Scope ได้ (Closure)
- โค้ดกระชับ อยู่ที่จุดใช้งาน
- ไม่ปนเปื้อน Global Namespace
ข้อเสีย
- Stack Trace ไม่มีชื่อฟังก์ชัน (ยากต่อ Debug) → ใช้ Named Function Expression
- Recursion ยาก (ไม่มีชื่อเรียกตัวเอง) → ใช้ Named Function Expression หรือ arguments.callee (Deprecated)
- โค้ดยาวในบรรทัดเดียวอ่านยาก → Extract เป็น Named Function
Named Function Expression (Best of Both)
var factorial = function fact(n) {
return n <= 1 ? 1 : n * fact(n - 1); // เรียกตัวเองได้ด้วยชื่อ fact
};
// Stack Trace จะแสดง "fact" แทน "anonymous"
สรุป: เมื่อไหร่ควรใช้
| สถานการณ์ | แนะนำ |
|---|---|
| Callback สั้น (1-2 บรรทัด) | Arrow Function |
| Callback ต้อง Recursive | Named Function Expression |
| IIFE / Module Pattern | Anonymous/Arrow IIFE |
| Event Handler ใช้ครั้งเดียว | Arrow Function |
| Logic ซับซ้อน/Reusable | Named Function (Declaration/Expression) |