การสร้างฟังก์ชัน
ในตอนนี้ เราจะได้มาเรียนรู้กันเรื่องการสร้างฟังก์ชันไว้สำหรับใช้งานครับ
Arrow function
ที่จริงแล้วในบทก่อนๆ เราก็ได้สร้างฟังก์ชันกันไปพอสมควรแล้ว เมื่อเรากำหนดให้โค้ดสักชุดทำงานเมื่อปุ่มถูกกด เราได้เขียนโค้ดที่มีลักษณะดังนี้
jsmyButton.onclick = () => { alert('Hi ' + yourName.value + '!') }และนี่คือฟังก์ชันที่เราเขียน:
js() => { alert('Hi ' + yourName.value + '!') }ในภาษา JavaScript ฟังก์ชันคือชุดคำสั่งที่ยังไม่ทำงานทันที แต่จะทำงานก็ต่อเมื่อมันถูกเรียกใช้งาน หน้าตาของมันเป็นแบบนี้
js() => { // โค้ดที่เราต้องการให้ทำงานเมื่อฟังก์ชันถูกเรียกใช้งาน }
ลองสร้างฟังก์ชันใน JavaScript Console
ลองใส่โค้ดนี้ลงใน JavaScript Console แล้วกดปุ่ม Enter
console.log('a') console.log('b')abเขียนโค้ดหลายบรรทัดใน JavaScript Console
ใน JavaScript Console เราสามารถเขียนโค้ดหลายบรรทัดได้ โดยการกดปุ่ม Shift+Enter เพื่อขึ้นบรรทัดใหม่
ปกติโค้ดจะทำงานจากบนลงล่าง เราจึงเห็น
aและbแสดงผลออกมาตามลำดับแต่เมื่อเรานำโค้ดใส่ไว้ข้างในฟังก์ชัน
() => { ... }ก็เหมือนกับว่าเราห่อหุ้มโค้ดไว้ให้ยังไม่ทำงาน ผลลัพธ์ที่เราได้กลับมาจึงเป็นข้อมูลที่เป็นชนิดฟังก์ชัน แล้วเราก็สามารถเรียกใช้งานมันได้() => { console.log('a') console.log('b') }() => { console.log('a') console.log('b') }เพื่อให้สามารถเรียกใช้งานมันได้ เดี๋ยวจะตั้งชื่อให้มัน (โดยเก็บใส่ตัวแปร)
let f = () => { console.log('a') console.log('b') }undefinedเมื่อตรวจสอบชนิดของตัวแปร
fจะเห็นว่าเป็นชนิดฟังก์ชันtypeof f"function"เราก็จะสามารถเรียกใช้งานฟังก์ชัน
fได้ เมื่อเรียกใช้งาน โค้ดภายในฟังก์ชันก็จะถูกทำงาน ส่งผลให้เราเห็นaและbแสดงออกมาf()ab
ขอบเขตของตัวแปร (variable scope)
ต่อไปเราจะมาเรียนรู้กันเรื่องขอบเขตของตัวแปรครับ
ตัวแปรที่ประกาศด้วยคำสั่ง
letจะมีขอบเขตอยู่แค่ในบล็อกที่ล้อมรอบ
ตัวอย่างที่ 1
ลองใส่โค้ดนี้ลงใน JavaScript Console
let f = () => { let a = 1 console.log('a is ' + a) }โค้ดนี้จะประกาศฟังก์ชัน
fขึ้นมาหลังจากนั้นเรียกใช้งานฟังก์ชัน
ff()a is 1ลองเรียกใช้งานตัวแปร
aaReferenceError: a is not defined>จะเห็นว่าตัวแปร
aไม่สามารถเข้าถึงได้ เพราะว่าตัวแปรaมีขอบเขตอยู่แค่ภายในบล็อกของฟังก์ชันfเท่านั้น
ตัวอย่างที่ 2
คราวนี้สร้างตัวแปร
aไว้ข้างนอก และทำให้แต่ละครั้งที่ฟังก์ชันfถูกเรียกใช้งาน ให้เพิ่มค่าของaทีละ 1let a = 1 let f = () => { console.log('a is ' + a) a = a + 1 }ลองเรียกใช้งานฟังก์ชัน
fดูหลายๆ ครั้งf()a is 1f()a is 2f()a is 3ลองเช็คค่าของตัวแปร
aดูa4เราจะเห็นว่า แต่ละครั้งที่เรียกใช้ฟังก์ชัน
f()โค้ดภายในฟังก์ชันจะอ้างถึงตัวแปรaที่อยู่ภายนอก ทำให้เป็นการอ้างถึงตัวแปรaตัวเดียวกัน ส่งผลให้ค่าของตัวแปรaเพิ่มขึ้นเรื่อยๆ
ตัวอย่างที่ 3
เราจะเริ่มจากโค้ดในตัวอย่างที่ 2 แต่เราจะย้ายการประกาศตัวแปร
aเข้าไปในฟังก์ชันf:let f = () => { let a = 1 console.log('a is ' + a) a = a + 1 }ลองเรียกใช้งานฟังก์ชัน
fดูหลายๆ ครั้งf()a is 1f()a is 1f()a is 1คราวนี้ เราจะเห็นว่า ในการเรียกใช้งานแต่ละครั้งของฟังก์ชัน
f()โค้ดภายในฟังก์ชันจะอ้างถึงตัวแปรaที่เพิ่งถูกสร้างขึ้นใหม่ขณะที่ฟังก์ชันถูกเรียกใช้งาน ซึ่งในแต่ละการเรียกใช้งานจะเป็นตัวแปรคนละตัวกัน
การสร้างฟังก์ชันรูปแบบอื่นๆ
ก่อนที่เราจะไปต่อ ขอหมายเหตุไว้นิดนึงว่า ในภาษา JavaScript มีวิธีสร้างฟังก์ชันที่ใช้กันบ่อยๆ อย่างน้อย 3 วิธีครับ:
js// แบบที่ 1 let f = () => { // โค้ดที่เราต้องการให้ทำงานเมื่อฟังก์ชันถูกเรียกใช้งาน } // แบบที่ 2 let f = function() { // โค้ดที่เราต้องการให้ทำงานเมื่อฟังก์ชันถูกเรียกใช้งาน } // แบบที่ 3 function f() { // โค้ดที่เราต้องการให้ทำงานเมื่อฟังก์ชันถูกเรียกใช้งาน }แต่ภายในคอร์สนี้ เราจะใช้แค่การเขียนโค้ดแบบแรกเท่านั้น (หากเรียนคอร์สนี้ควบคู่กับคอร์สอื่นๆ อาจจะได้เจอวิธีการเขียนโค้ดที่แตกต่างกันไป)
Up next
- เราพอรู้จักกับฟังก์ชันแล้ว ฟังก์ชันเป็นโครงสร้างภาษาที่มีประโยชน์หลายอย่างมากๆ และในตอนต่อไป เราจะลองใช้ฟังก์ชันมาลดโค้ดที่ซ้ำกันดู