หน้าหลัก/บทเรียนพื้นฐาน/5. การประกาศฟังก์ชัน
เวลาเรียนโดยประมาณ: 20 นาที
Chapter 5: Syntax Evolution

ฟังก์ชันยุคเก่า vs ยุคใหม่ (Regular vs Arrow)

ถ้าเปรียบโค้ดเป็นภาษาเขียน "การสร้างฟังก์ชัน" ก็คือการสอนให้คอมพิวเตอร์รู้จักคำศัพท์ใหม่ๆ! แต่รู้หรือไม่ว่าปัจจุบัน การสอนคอมพิวเตอร์มีอยู่ 2 สไตล์หลักๆ คือ สไตล์ดั้งเดิม (Regular) และ สไตล์วัยรุ่น (Arrow) วันนี้เราจะมาเจาะลึกกันว่ามันต่างกันอย่างไร และทำไมโลกถึงเปลี่ยนไปใช้แบบใหม่กัน

Classic vs Modern Function Syntax

พจนานุกรมปูพื้นฐานการเขียนฟังก์ชัน (Function Syntax Dictionary)

สร้างความเข้าใจเกี่ยวกับศัพท์เทคนิคด้านรูปแบบการเขียนชุดคำสั่ง (Syntax) กันก่อนเริ่มลุย:

1. Regular Function (ฟังก์ชันปกติ)

การประกาศฟังก์ชันแบบฉบับดั้งเดิมโดยพิมพ์คีย์เวิร์ด function มีความสามารถเรื่องการเรียกใช้งานก่อนสร้าง (Hoisting) และขอบเขตตัวแปรยืดหยุ่น

2. Arrow Function (ฟังก์ชันลูกศร)

การเขียนฟังก์ชันสไตล์โมเดิร์นฉบับย่นย่อที่ใช้สัญลักษณ์เครื่องหมาย => (ลูกศรอ้วน) แทนการเขียนคำว่า function ที่นิยมใช้อย่างมากใน React

3. Implicit Return (ส่งกลับแบบละไว้)

ความสามารถพิเศษของฟังก์ชันลูกศรในการตัดทิ้งทั้งปีกกา {} และคีย์เวิร์ด return ทิ้งไปได้ทันที เมื่อคำสั่งประมวลผลมีความยาวเพียงบรรทัดเดียว

4. Lexical this (ผูกสายสัมพันธ์ตัวฉัน)

คุณสมบัติการจดจำค่าสเตตัสตัวตน (this) ของฟังก์ชันลูกศรที่จะผูกติดกับสถานที่กำเนิดของมันเสมอ ไม่เปลี่ยนผันตามผู้เรียกใช้ภายนอกเหมือนแบบเก่า

1บทนำ: ฟังก์ชัน (Function) คืออะไรกันแน่? ทำไมโปรแกรมเมอร์ถึงขาดมันไม่ได้

ก่อนที่เราจะไปเจาะลึกเรื่องวิธีเขียนโค้ด (Syntax) เราต้องมาทำความเข้าใจ "แก่นแท้" ของฟังก์ชันกันก่อน ลองจินตนาการว่าคุณเป็นผู้จัดการร้านอาหารที่ต้องสอนพนักงานใหม่ให้ทำ "ข้าวผัดกะเพรา"

ถ้าคุณไม่สอนให้เขาจำสูตร ทุกครั้งที่ลูกค้าสั่งกะเพรา คุณจะต้องเดินไปบอกพนักงานว่า:

"1. ตั้งกระทะ 2. ใส่น้ำมัน 3. ใส่กระเทียม 4. ใส่หมูสับ 5. ใส่ใบกะเพรา 6. ตักใส่จาน"

คุณจะต้องพูดประโยคยาวๆ นี้ซ้ำๆ ทั้งวัน (นั่นคือการเขียนโค้ดแบบก๊อปปี้แปะ) แต่ในทางกลับกัน ถ้าคุณเขียนสูตรนี้แปะผนังไว้ แล้วตั้งชื่อมันว่า ทำกะเพรา()ครั้งต่อไปที่คุณต้องการข้าวผัดกะเพรา คุณก็แค่ตะโกนบอกพนักงานว่า "พนักงาน! ทำกะเพรา() 1 ที่!"พนักงานก็จะไปอ่านสูตรบนผนังและทำตามขั้นตอนทั้ง 6 ข้อนั้นเองโดยอัตโนมัติ

ในโลกของการเขียนโปรแกรมก็เช่นเดียวกัน! ฟังก์ชัน (Function) คือการเอาคำสั่งหลายๆ บรรทัด มามัดรวมกันแล้วตั้งชื่อให้มัน เพื่อให้เราสามารถ "เรียกใช้ซ้ำ (Reuse)" ได้เรื่อยๆ โดยไม่ต้องพิมพ์คำสั่งยาวๆ เหล่านั้นใหม่ทุกครั้ง นี่คือหัวใจสำคัญที่ทำให้โปรแกรมของเราทำงานได้อย่างเป็นระบบและโค้ดไม่รกรุงรัง

2โครงสร้างพื้นฐาน: การสร้างฟังก์ชันแบบดั้งเดิม (Regular Function)

การสร้างฟังก์ชันในยุคแรกเริ่มของ JavaScript (และยังคงใช้ได้ดีมาจนถึงปัจจุบัน) จะใช้คำสั่งที่ตรงไปตรงมามาก เรียกว่า Regular Function หรือฟังก์ชันแบบปกติ ซึ่งมีองค์ประกอบสำคัญ 4 ส่วนหลักๆ ที่คุณต้องจำให้ขึ้นใจ:

  • คำสงวน (Keyword): ต้องเริ่มต้นด้วยคำว่า function เสมอ เพื่อให้คอมพิวเตอร์รู้ว่าเรากำลังจะสร้างฟังก์ชัน
  • ชื่อฟังก์ชัน (Name): ตั้งชื่ออะไรก็ได้ แต่ควรสอดคล้องกับสิ่งที่มันทำ (มักจะขึ้นต้นด้วยคำกริยา เช่น calculate, getUser, createOrder)
  • พารามิเตอร์ (Parameters): คือ () วงเล็บที่ต่อท้ายชื่อฟังก์ชัน เอาไว้สำหรับ "รับวัตถุดิบ" ที่จะส่งเข้ามาให้ฟังก์ชันประมวลผล
  • ตัวเครื่องจักร (Body): คือ { ... } ปีกกาครอบคำสั่งการทำงานทั้งหมดเอาไว้ด้านใน

ลองดูตัวอย่างการเขียนจริงกัน:

ตัวอย่าง: ฟังก์ชันคิดราคาสินค้ารวม VAT
// เราตั้งชื่อฟังก์ชันว่า calculateTotal // และเปิดวงเล็บ (price) เพื่อบอกว่า ฟังก์ชันนี้ต้องการ 'ราคาตั้งต้น' ส่งเข้ามานะ function calculateTotal(price) { // ด้านในปีกกา คือขั้นตอนการประมวลผล let vat = price * 0.07; let total = price + vat; // คำสั่ง return คือการ "คายผลลัพธ์" ออกจากเครื่องจักร return total; } // ---------------------------------------- // วิธีเรียกใช้งาน (Calling a function) // ---------------------------------------- let myCoffee = calculateTotal(100); console.log(myCoffee); // ผลลัพธ์จะออกมาเป็น 107

ข้อดีของการเขียนแบบนี้คือ อ่านง่ายและชัดเจน แค่กวาดสายตาเห็นคำว่า function สีชมพูๆ เราก็รู้ได้ทันทีว่านี่คือสูตรอาหารบล็อกใหม่

3ยุคแห่งความรวดเร็ว: กำเนิด Arrow Function (ลูกศรอ้วน)

ในยุคปัจจุบันที่โปรเจกต์มีขนาดใหญ่ขึ้นมหาศาล โปรแกรมเมอร์ต้องเขียนฟังก์ชันวันละเป็นร้อยๆ ตัว การต้องมานั่งพิมพ์คำว่า function ทุกครั้งมันทำให้โค้ดยืดยาวและกินพื้นที่หน้าจอมาก ในปี 2015 ภาษา JavaScript จึงได้เปิดตัวไวยากรณ์ (Syntax) การเขียนฟังก์ชันแบบใหม่ที่หน้าตาล้ำสมัยและสั้นลงมาก เรียกว่า Arrow Function

สูตรลับการแปลงร่างเป็น Arrow Function

การเขียนแบบใหม่มีกฎง่ายๆ แค่ 3 ข้อ:

1. ตัดทิ้ง: หั่นคำว่า function ทิ้งไปเลย! ไม่ต้องใช้แล้ว
2. เปลี่ยนเป็นตัวแปร: ใช้ const แล้วตามด้วยชื่อฟังก์ชัน และใส่เครื่องหมาย = (เหมือนการสร้างตัวแปรปกติ)
3. เติมลูกศร: ใส่ลูกศรอ้วน => คั่นระหว่างวงเล็บ () กับปีกกา {}

เรามาดูตัวอย่างการแปลงโค้ดจากหัวข้อที่แล้วกัน:

ตัวอย่าง: เปลี่ยนโฉม calculateTotal ให้เป็น Arrow
// 1. ประกาศตัวแปร const ชื่อ calculateTotal // 2. ใส่ = (price) เพื่อบอกว่ารับค่า price // 3. ยิงลูกศร => ทะลวงเข้าไปในปีกกา const calculateTotal = (price) => { let vat = price * 0.07; let total = price + vat; return total; };

สังเกตไหม? ตัวเนื้อในฟังก์ชัน (Body) ไม่ได้เปลี่ยนไปเลยสักนิดเดียว เปลี่ยนแค่ "เปลือกนอก" เท่านั้นเอง!ในฐานะมือใหม่ คุณอาจจะรู้สึกว่า "เอ๊ะ... มันก็ยาวพอกันนี่นา แค่เปลี่ยนสลับที่ตัวอักษรเฉยๆ ไม่ใช่เหรอ?" มาดูข้อถัดไปกัน แล้วจะเข้าใจว่าทำไมโปรแกรมเมอร์ถึงคลั่งไคล้การเขียนแบบนี้!

สื่อจำลอง: การแปลงร่างฟังก์ชัน (Syntax Transformer)

คลิกเลือกตัวอย่างฟังก์ชันในเมนูด้านซ้ายมือ สังเกตโค้ดฝั่งขวา... ด้านบนคือโค้ดยุคเก่า ด้านล่างคือโค้ดยุคใหม่สังเกตการเปลี่ยนแปลงว่า function หายไป และลูกศร => มาแสดงในตำแหน่งใดแทน

เลือกรูปแบบโค้ดตัวอย่าง

ยุคเก่า (Regular Function)
function sayHello(name) {
  return "Hello, " + name;
}
แปลงร่างเป็นยุคใหม่
ยุคใหม่ (Arrow Function) ✨
const sayHello = (name) => {
  return "Hello, " + name;
}

4ความสามารถลับสุดยอดของ Arrow Function

สาเหตุที่แท้จริงที่ทำให้ Arrow Function ได้รับความนิยม ไม่ใช่แค่การเปลี่ยนเปลือกนอกให้ดูเท่ขึ้น แต่มันมี "พลังแฝง (Superpowers)" ที่ฟังก์ชันแบบเก่าทำไม่ได้ นั่นคือ "การย่อโค้ดแบบสุดขีด (Implicit Return)"

กฎการย่อโค้ด (Implicit Return)

"ถ้าฟังก์ชันของคุณ มีคำสั่งทำงานแค่ บรรทัดเดียว (และบรรทัดนั้นมีคำว่า return) คุณสามารถลบปีกกา {} และลบคำว่า return ทิ้งไปได้เลย!"

ก่อนย่อ (ยาวๆ)

const double = (num) => {
  return num * 2;
}

หลังย่อ (บรรทัดเดียวจบ!)

const double = (num) => num * 2;

* จาก 3 บรรทัด หดเหลือบรรทัดเดียวสั้นๆ อ่านง่ายเหมือนคณิตศาสตร์เบื้องต้นเลย

💡 แล้วเราควรเลือกใช้แบบไหนดีในชีวิตจริง?

สำหรับผู้ที่เพิ่งเริ่มต้นศึกษา Next.js และ React คุณจะเจอว่าโลกนี้ถูกครองด้วย Arrow Function ไปกว่า 90% แล้ว โดยเฉพาะการสร้าง Component เล็กๆ หรือการส่ง Callback Function

คำแนะนำ:

  • ถ้าคุณสร้างหน้าเว็บหลัก (Page) เช่น export default function Page() ให้ใช้ Regular Function เพื่อความชัดเจนและเป็นทางการ
  • แต่ถ้าคุณสร้าง Component ย่อย, สร้าง Helper Function (แบบที่เรียนในบทที่ 4), หรือเขียนฟังก์ชันคำนวณสั้นๆ ให้ใช้ Arrow Function เพื่อให้โค้ดสะอาดและทันสมัยที่สุด!

5ความลับระดับแอดวานซ์: ทำไม Arrow Function ถึงแก้ปัญหาโลกแตกได้?

ถ้าคุณไปถามโปรแกรมเมอร์รุ่นเก๋าว่า "ทำไมคุณถึงรัก Arrow Function?" คำตอบที่คุณจะได้ยินบ่อยที่สุดคือ "เพราะมันแก้ปัญหาเรื่องคำว่า this"แม้ว่าเรื่องนี้จะค่อนข้างลึก แต่จะอธิบายให้ฟังแบบง่ายๆ เพื่อให้รู้ลึกถึงแก่นแท้เลย!

🤯

ปัญหาโลกแตกของ Regular Function

ในสมัยก่อน เวลาเราใช้คำสั่ง this (แปลว่า "ตัวฉันเอง") ภายใน Regular Function ตัว this มันมักจะ "เปลี่ยนความหมายไปเรื่อยๆ" ตามคนที่เรียกใช้มัน (เหมือนนกแก้วที่เปลี่ยนเจ้าของไปเรื่อยๆ) ทำให้บางครั้งโค้ดพังเพราะมันจำไม่ได้ว่า "ตัวฉันเอง" คือใครกันแน่!

🦸‍♀️

ฮีโร่ขี่ม้าขาว Arrow Function

แต่สำหรับ Arrow Function ถูกออกแบบมาให้ "อ้างอิงถึงขอบเขตที่สร้างขึ้นมาเสมอ" (Lexical this) หากมันถูกสร้างขึ้นมาในขอบเขตนี้ คำว่า this ก็จะอ้างอิงถึงขอบเขตนี้ตลอดไป ไม่ว่าใครจะเรียกใช้ก็ตาม นี่คือเหตุผลว่าทำไม React ถึงแนะนำให้ใช้ Arrow Function ในการจัดการปุ่มกด (onClick)


บททดสอบท้ายบทเรียน (Quiz)

มาลองตอบคำถามเพื่อทดสอบว่าคุณจำรูปแบบ (Syntax) ของ Arrow Function ได้แม่นยำแค่ไหน

🧠 ทบทวนความเข้าใจ (Mini Quiz)

ข้อ 1 / 5

Q:ข้อใดคือรูปแบบการเขียน "Arrow Function" ที่ถูกต้องที่สุด?

💡

ลองศึกษาเฉลยเพื่อดูแนวคิดเพิ่มเติม...

Arrow Function จะเริ่มต้นด้วยการประกาศตัวแปร (const) ตามด้วยชื่อฟังก์ชัน เครื่องหมายเท่ากับ (=) วงเล็บสำหรับรับค่า () และปิดท้ายด้วยลูกศร (=>)

ยินดีด้วย! คุณเรียนจบหลักสูตรพื้นฐานแล้ว!

เตรียมพร้อมเข้าสู่โลกของจริง

คุณได้เรียนรู้ตั้งแต่พื้นฐาน API, Callback, การแบ่ง Component, Helper Function และ Syntax การเขียนฟังก์ชันครบถ้วนแล้ว ตอนนี้คุณมีอาวุธครบมือที่จะเข้าไปลุยโปรเจกต์ระดับ Enterprise อย่าง ZoonDebit/ZoonCart ได้แล้ว! 🎉

กลับสู่หน้าแดชบอร์ดหลัก