JavaScript 中的函式

JavaScript 中的函式

本文將解釋 JavaScript 中的函式。

YouTube Video

JavaScript 中的函式

函式在 JavaScript 中是執行特定任務的可重複使用的代碼塊。使用函式可以提高代碼的可讀性並使維護變得更加容易。函式可以用多種方式定義,並且可以通過參數和返回值靈活操作。

定義函式的方法

函式聲明

函數可以使用 function 關鍵字來定義。函式聲明會在代碼執行之前被提升,因此可以在定義之前被調用。

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

在此範例中,因為在 greet 函式聲明之前已被調用,會顯示 Hello, EveryoneHello, Alice

函式表達式

函式也可以通過賦值給變數來定義。在這種情況下,函式不會被提升,因此只能在定義之後調用。

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

在此範例中,會顯示 Hello, Bob

箭頭函式

箭頭函式是一種使用更簡短語法來定義函式的方法。在使用匿名函式(無名稱的函式)時非常有用。箭頭函式在 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

在此範例中,函式可以定義為 greetgreetShort。如果函式只有一行,可以像 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 沒有返回值,其返回值為 undefined

匿名函式

沒有名稱的函式稱為匿名函式。它們通常用作函式表達式或箭頭函式。

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

立即執行函式表達式 (IIFE)

立即執行函式表達式(IIFE)是一種在定義後立即執行的函式。它通常用於控制作用域。

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

它在聲明時立即執行。

回調函式

將函式作為參數傳遞給另一個函式以便稍後執行,稱為回調函式。它常用於異步處理和事件處理。

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

在此範例中,一個輸出值到控制台的函式被傳遞作為回調函式。

遞歸函式

函式調用自身被稱為遞歸,而利用這一特性進行重複處理的函式稱為遞歸函式。例如,可以使用遞歸來實現計算階乘的函式,如下所示。

 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

 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

obj 變數中的 greet 是使用 function 關鍵字聲明的。因此,this 關鍵字指向了 obj 變數的物件。另一方面,obj2 變數中的 greet 是使用箭頭函數聲明的。因此,在此範例中,this 關鍵字指向外部範疇中的物件,並且是 undefined

函數範疇與閉包

在函數內定義的變數無法從函數外部存取。這被稱為 函數範疇。還有一個叫做 閉包 的特性,能夠保留函數定義時的範疇。

 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,因為它保留了定義時的範疇。

總結

  • 定義函數的方法有多種,包括 函數聲明函數表達式箭頭函數
  • 函數可以接收 參數 並返回
  • 有一些特殊用途的函數,例如 回調函數遞歸函數
  • 在處理 this 時需要特別注意,因為箭頭函數與普通函數的行為有所不同。
  • 閉包 可用於從作用域外部存取內部變數。

函數是 JavaScript 中的重要概念之一,依靠其靈活的結構。

您可以在我們的 YouTube 頻道上使用 Visual Studio Code 來跟隨上述文章一起學習。 請也查看我們的 YouTube 頻道。

YouTube Video