พจนานุกรมปูพื้นฐานการเขียนฟังก์ชัน (Function Syntax Dictionary)
สร้างความเข้าใจเกี่ยวกับศัพท์เทคนิคด้านรูปแบบการเขียนชุดคำสั่ง (Syntax) กันก่อนเริ่มลุย:
การประกาศฟังก์ชันแบบฉบับดั้งเดิมโดยพิมพ์คีย์เวิร์ด function มีความสามารถเรื่องการเรียกใช้งานก่อนสร้าง (Hoisting) และขอบเขตตัวแปรยืดหยุ่น
การเขียนฟังก์ชันสไตล์โมเดิร์นฉบับย่นย่อที่ใช้สัญลักษณ์เครื่องหมาย => (ลูกศรอ้วน) แทนการเขียนคำว่า function ที่นิยมใช้อย่างมากใน React
ความสามารถพิเศษของฟังก์ชันลูกศรในการตัดทิ้งทั้งปีกกา {} และคีย์เวิร์ด return ทิ้งไปได้ทันที เมื่อคำสั่งประมวลผลมีความยาวเพียงบรรทัดเดียว
คุณสมบัติการจดจำค่าสเตตัสตัวตน (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 หายไป และลูกศร => มาแสดงในตำแหน่งใดแทน
เลือกรูปแบบโค้ดตัวอย่าง
return "Hello, " + 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)
