ฟังก์ชันใน JavaScript

ฟังก์ชันใน JavaScript

บทความนี้อธิบายฟังก์ชันใน JavaScript

YouTube Video

ฟังก์ชันใน JavaScript

ฟังก์ชัน ใน JavaScript คือลำดับของโค้ดที่สามารถใช้ซ้ำได้สำหรับทำงานเฉพาะเจาะจง การใช้ฟังก์ชันช่วยให้โค้ดอ่านง่ายขึ้นและทำให้การบำรุงรักษาง่ายขึ้น ฟังก์ชันสามารถกำหนดได้หลายวิธีและปรับเปลี่ยนได้อย่างยืดหยุ่นด้วยการใช้อาร์กิวเมนต์และค่าที่ส่งกลับ

วิธีการกำหนดฟังก์ชัน

การประกาศฟังก์ชัน

ฟังก์ชันสามารถกำหนดได้โดยใช้คำสำคัญ function การประกาศฟังก์ชันจะถูก hoisted ก่อนที่โค้ดจะทำงาน ดังนั้นสามารถเรียกใช้ได้ก่อนที่ฟังก์ชันจะถูกกำหนด

1console.log(greet("Everyone")); // Hello, Everyone
2
3function greet(name) {
4    return "Hello, " + name;
5}
6
7console.log(greet("Alice")); // Hello, Alice

ในตัวอย่างนี้ เนื่องจากฟังก์ชัน greet ถูกเรียกใช้ก่อนการประกาศ ฟังก์ชันจะแสดง Hello, Everyone และ Hello, Alice

การแสดงฟังก์ชันเป็นนิพจน์

ฟังก์ชันสามารถกำหนดได้โดยการกำหนดให้เป็นตัวแปร ในกรณีนี้ ฟังก์ชันจะไม่ถูก hoisted และสามารถเรียกใช้ได้หลังจากที่ถูกกำหนดแล้วเท่านั้น

1const greet = function(name) {
2    return "Hello, " + name;
3};
4
5console.log(greet("Bob")); // Hello, Bob

ในตัวอย่างนี้ จะปรากฏข้อความว่า Hello, Bob

ฟังก์ชันแบบลูกศร (Arrow Function)

ฟังก์ชันแบบลูกศรเป็นวิธีการกำหนดฟังก์ชันด้วยรูปแบบที่สั้นกว่า ฟังก์ชันแบบลูกศรมีประโยชน์อย่างยิ่งเมื่อใช้กับ ฟังก์ชันที่ไม่มีชื่อ (anonymous functions) ฟังก์ชันแบบลูกศรมีพฤติกรรมที่แตกต่างเกี่ยวกับคีย์เวิร์ด this

 1const greet = (name) => {
 2    return "Hello, " + name;
 3};
 4
 5// When it can be expressed in a single line,
 6// `return` and curly braces can be omitted
 7const greetShort = name => "Hello, " + name;
 8
 9console.log(greet("Charlie")); // Hello, Charlie
10console.log(greetShort("Dave")); // Hello, Dave

ฟังก์ชันสามารถถูกกำหนดเป็น greet และ greetShort ในตัวอย่างนี้ หากฟังก์ชันมีเพียงบรรทัดเดียว คุณสามารถเว้น {} (วงเล็บปีกกา) ได้ เช่น greetShort

องค์ประกอบของฟังก์ชัน

อาร์กิวเมนต์

ค่าที่ถูกส่งให้ฟังก์ชันเรียกว่า อาร์กิวเมนต์ โดยการระบุอาร์กิวเมนต์เมื่อกำหนดฟังก์ชัน คุณสามารถส่งค่าได้เมื่อเรียกใช้ฟังก์ชัน

1function add(a, b) {
2    return a + b;
3}
4
5console.log(add(2, 3)); // 5

อาร์กิวเมนต์เริ่มต้น

คุณสามารถกำหนดค่าเริ่มต้นได้หากไม่มีค่าใดถูกส่งไปยังอาร์กิวเมนต์

1function greet(name = "Guest") {
2    return "Hello, " + name;
3}
4
5console.log(greet()); // Hello, Guest
6console.log(greet("Alice")); // Hello, Alice

ในตัวอย่างนี้ หากเรียกใช้ greet() ค่าเริ่มต้น Guest จะถูกใช้

ค่าที่ส่งกลับ

คุณสามารถส่งค่าที่ส่งกลับได้จากฟังก์ชันโดยใช้คำสั่ง return หากไม่มีคำสั่ง return ฟังก์ชันจะส่งกลับค่า undefined

1function greet(name) {
2    console.log('Hello, ' + name + '!');
3}
4function square(num) {
5    return num * num;
6}
7
8console.log(square(4)); // 16
9console.log(greet('Alice')); // undefined

ในตัวอย่างนี้ เนื่องจาก greet ไม่ได้ส่งค่ากลับ ค่า return จึงเป็น undefined

ฟังก์ชันนิรนาม

ฟังก์ชันที่ไม่มีชื่อเรียกว่าฟังก์ชันนิรนาม (anonymous function) ฟังก์ชันเหล่านี้มักใช้เป็น expression ของฟังก์ชันหรือฟังก์ชันลูกศร

1const double = function(num) {
2    return num * 2;
3};
4
5console.log(double(5)); // 10

นิพจน์ฟังก์ชันที่ถูกเรียกใช้งานทันที (IIFE)

นิพจน์ฟังก์ชันที่ถูกเรียกใช้งานทันที (IIFE) คือฟังก์ชันที่ถูกดำเนินการทันทีหลังจากถูกกำหนด มักถูกใช้เพื่อควบคุมขอบเขต (scope)

1/* Example of IIFE: Immediately Invoked Function Expression */
2(function() {
3    console.log("This is an IIFE");
4})(); // This is an IIFE

ฟังก์ชันนี้จะถูกดำเนินการทันทีที่ถูกประกาศ

ฟังก์ชันเรียกกลับ (Callback Function)

การส่งฟังก์ชันเป็นอาร์กิวเมนต์ให้กับฟังก์ชันอื่นเพื่อใช้งานในภายหลังเรียกว่าฟังก์ชันเรียกกลับ (callback function) ฟังก์ชันนี้ถูกใช้งานบ่อยในกระบวนการแอสิงโครนัสและการจัดการเหตุการณ์ (event handling)

1function processData(callback) {
2    let data = "Processed Data";
3    callback(data);
4}
5
6processData(function(result) {
7    console.log(result); // Processed Data
8});

ในตัวอย่างนี้ ฟังก์ชันที่แสดงผลลัพธ์ไปยังคอนโซลถูกส่งเป็นฟังก์ชันเรียกกลับ

ฟังก์ชันแบบเรียกซ้ำ

การที่ฟังก์ชันเรียกใช้งานตัวเองเรียกว่า recursion และฟังก์ชันที่ดำเนินการแบบซ้ำๆ โดยใช้หลักการนี้เรียกว่าฟังก์ชันแบบเรียกซ้ำ ตัวอย่างเช่น ฟังก์ชันสำหรับคำนวณแฟกทอเรียลสามารถใช้งาน recursion ได้ดังนี้

 1function factorial(n) {
 2    if (n === 0) {
 3        return 1;
 4    } else {
 5        return n * factorial(n - 1);
 6    }
 7}
 8
 9console.log(factorial(5));
10// Output : 120
11// (5 * 4 * 3 * 2 * 1 = 120)

ในตัวอย่างนี้ ค่าแฟกทอเรียลของ 5 ซึ่งคือ 120 จะแสดงขึ้น

คีย์เวิร์ด this

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

 1const obj = {
 2    name: "Alice",
 3    greet: function() {
 4        console.log(this.name); // Refers to "Alice"
 5    }
 6};
 7
 8obj.greet(); // Alice
 9
10const obj2 = {
11    name: "Bob",
12    greet: () => {
13        // Arrow function refers to the outer scope (undefined here)
14        console.log(this.name);
15    }
16};
17
18obj2.greet(); // undefined

การประกาศ greet ของตัวแปร obj ใช้คำสำคัญ function ดังนั้น คำสำคัญ this จึงอ้างอิงถึงออบเจ็กต์ของตัวแปร obj ในทางตรงกันข้าม การประกาศ greet ของตัวแปร obj2 ใช้ฟังก์ชันลูกศร (arrow function) ดังนั้น คำสำคัญ this จะอ้างถึงออบเจ็กต์ในขอบเขตด้านนอก และเป็น undefined ในตัวอย่างนี้

ขอบเขตของฟังก์ชันและคลอชเชอร์

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

 1function outer() {
 2    let outerVar = "I am outer!";
 3
 4    function inner() {
 5        console.log(outerVar); // Can access outerVar
 6    }
 7
 8    return inner;
 9}
10
11const innerFunc = outer();
12innerFunc(); // I am outer!

ในตัวอย่างนี้ ฟังก์ชัน inner สามารถเข้าถึงตัวแปร outerVar ได้ เนื่องจากมันรักษาขอบเขตที่มันถูกกำหนดไว้

สรุป

  • มีวิธีการหลากหลายในการประกาศฟังก์ชัน เช่น function declarations, function expressions และ arrow functions
  • ฟังก์ชันสามารถรับ อาร์กิวเมนต์ และคืนค่าเป็น ค่าผลลัพธ์ ได้
  • มีการใช้งานพิเศษ เช่น callback functions และ recursive functions
  • ควรระมัดระวังกับการจัดการ this เนื่องจากฟังก์ชันลูกศร (arrow functions) และฟังก์ชันปกติทำงานแตกต่างกัน
  • คลอชเชอร์ (closures) สามารถใช้เข้าถึงตัวแปรภายในจากนอกขอบเขตได้

ฟังก์ชันเป็นหนึ่งในแนวคิดสำคัญใน JavaScript ที่ใช้ประโยชน์จากโครงสร้างที่ยืดหยุ่นได้ของมัน

คุณสามารถติดตามบทความข้างต้นโดยใช้ Visual Studio Code บนช่อง YouTube ของเรา กรุณาตรวจสอบช่อง YouTube ด้วย

YouTube Video