☕ NEW! 完成新手任務即可參加抽獎!LINE 星巴克禮券等你拿,名額有限!        🎉 推廣活動:邀請好友註冊 DevLearn,累積推薦抽 LINE 星巴克禮券! 活動詳情 →        🔥 活動期間 2026/4/1 - 5/31 |已有 0 人參加       
javascript 初學

函式(Function)

什麼是函式?

比喻:函式就像一台果汁機 🍹

放入水果(參數)→ 果汁機運作(執行程式)→ 產出果汁(回傳值)。 你可以重複使用這台果汁機,不用每次都重新造一台。


函式宣告

// 方式 1:函式宣告(Function Declaration)
function greet(name) {            // ← 函式名稱 + 參數
    return `你好,${name}!`;      // ← return 回傳結果
}
console.log(greet("小明"));       // ← "你好,小明!"

// 方式 2:函式表達式(Function Expression)
const greet2 = function(name) {
    return `你好,${name}!`;
};

// 方式 3:箭頭函式(Arrow Function,ES6)
const greet3 = (name) => {
    return `你好,${name}!`;
};

// 箭頭函式簡寫(只有一行 return 時)
const greet4 = (name) => `你好,${name}!`;
// 只有一個參數時可以省略括號
const greet5 = name => `你好,${name}!`;

參數

// 預設參數(ES6)
function greet(name = "訪客") {   // ← 沒傳的話用預設值
    return `你好,${name}!`;
}
console.log(greet());             // ← "你好,訪客!"
console.log(greet("小明"));       // ← "你好,小明!"

// 剩餘參數(Rest Parameters)
function sum(...numbers) {        // ← ...numbers 收集所有參數成陣列
    let total = 0;
    for (let n of numbers) {
        total += n;
    }
    return total;
}
console.log(sum(1, 2, 3));        // ← 6
console.log(sum(1, 2, 3, 4, 5)); // ← 15

// 解構參數
function createUser({ name, age, email = "" }) {
    console.log(`${name}, ${age}歲`);
}
createUser({ name: "小明", age: 20 });

回傳值

// 單一回傳值
function add(a, b) {
    return a + b;                 // ← 回傳結果後,函式立刻結束
    console.log("這行不會執行");   // ← return 後的程式碼不會執行
}

// 回傳物件
function createUser(name, age) {
    return { name, age };         // ← ES6 簡寫:{ name: name, age: age }
}
let user = createUser("小明", 20);
console.log(user.name);          // ← "小明"

// 沒有 return → 回傳 undefined
function doSomething() {
    console.log("做了一些事");
    // 沒有 return
}
let result = doSomething();       // ← undefined

作用域(Scope)

let global = "我是全域變數";      // ← 全域:到處都能用

function outer() {
    let outerVar = "我是外層變數"; // ← 函式作用域

    function inner() {
        let innerVar = "我是內層變數";
        console.log(global);     // ✅ 可以存取全域
        console.log(outerVar);   // ✅ 可以存取外層
        console.log(innerVar);   // ✅ 可以存取自己的
    }

    inner();
    console.log(innerVar);       // ❌ Error:innerVar 在這裡不存在
}

閉包(Closure)

function createCounter() {
    let count = 0;                // ← 這個變數被「關」在閉包裡

    return {
        increment: () => ++count, // ← 可以存取外層的 count
        getCount: () => count     // ← 可以讀取 count
    };
}

const counter = createCounter();
console.log(counter.increment()); // ← 1
console.log(counter.increment()); // ← 2
console.log(counter.getCount());  // ← 2
// 外部無法直接存取 count,只能透過回傳的方法

高階函式

// 函式可以作為參數傳遞
function doOperation(a, b, operation) {
    return operation(a, b);       // ← 呼叫傳入的函式
}

const add = (a, b) => a + b;
const multiply = (a, b) => a * b;

console.log(doOperation(5, 3, add));       // ← 8
console.log(doOperation(5, 3, multiply));  // ← 15

// 函式可以作為回傳值
function multiplier(factor) {
    return (num) => num * factor;  // ← 回傳一個新函式
}
const double = multiplier(2);
const triple = multiplier(3);
console.log(double(5));           // ← 10
console.log(triple(5));           // ← 15

💡 大家的想法 · 0

載入中...
💬 即時聊天室 🟢 0 人在線
😀 😎 🤓 💻 🎮 🎸 🔥
➕ 新問題
📋 我的工單
💬 LINE 社群
🔒
需要註冊才能使用此功能
註冊帳號即可解鎖測驗、遊戲、簽到、筆記下載等所有功能,完全免費!
免費註冊