JavaScript 函式入門-02:函式宣告、表達式、回呼與執行階段

更新於 發佈於 閱讀時間約 9 分鐘

終於慢慢撿回 JS 的手感了(到底是要拖多久),繼前一篇瞭解基本變數和JS 難搞的地方,我們來看:函式宣告(Function Declaration)、函式表達式(Function Expression,包括匿名函式)、回呼函式(Callback Function),再到創作階段(Creation Phase)和執行階段(Execution Phase),一步步解釋,還會配合範例講解。

1. 函式宣告 (Function Declaration)

函式宣告是用 function 關鍵字直接定義一個有名字的函式。它的特點是可以在程式碼中的任何地方呼叫,因為 JS 引擎會在執行前把函式宣告「提升」(Hoisting)到作用域頂端。即使先 Call 函數再定義也沒問題。

公式:定義function,() 裡面是輸入的值,不寫任何東西也可以。

function functionName(parameters) {
// 函式內容
return something;
}

實際操作:特別注意反引號跟單引號,反引號Windows 鍵盤:

通常在 Esc 下方、1 左邊 的那個鍵,跟 ~ 是同一顆。

function sayHello(name) {
return `Hello, ${name}!`; // 注意!是反引號不是''單引號喔
}

console.log(sayHello("Bicky")); // 輸出: Hello, Bicky!

關鍵點:

  • Hoisting:即使你先呼叫函式再定義它,程式也不會報錯,因為 JS 會把函式宣告「拉到」作用域頂端。
  • 範例(證明 Hoisting):先叫出功能,再定義。
console.log(sayHi("Charlie")); // 輸出: Hi, Charlie!

function sayHi(name) {
return `Hi, ${name}!`;
}

2. 函式表達式 (Function Expression)

函式表達式是把函式賦值給一個變數。函式可以是有名字的,也可以是匿名函式(Anonymous Function)。它的特點是不會被 Hoisting,所以必須先定義才能呼叫。

公式:

const functionName = function [名字](parameters) {
// 函式內容
return something;
};

範例(匿名函式):

const greet = function(name) { // 他沒有取名字,是用變數
return `Greetings, ${name}!`;
};

console.log(greet("Bicky")); // 輸出: Greetings, Bicky!

範例(具名函式表達式)(常用在遞回:

3! = 3 × 2 × 1 = 6

5! = 5 × 4 × 3 × 2 × 1 = 120

const factorial = function cal(n) {

    if (n <= 1) return 1;

    return n * cal(n-1); // 一開始我寫n*n+1 忘記四則運算

};

console.log(factorial(5)); // 120

console.log(factorial(0)); // 1(0 的階乘是 1)

這是我練習的,來看看問題出在哪裡?

const factorial = function cal(n) { if (n <= 1) return 1; return cal(n*n+1); };
return cal(n * n + 1); 

這一行是「把 n 自己平方再加一」,不是階乘啦!

階乘的定義是:

👉 n * (n - 1) * (n - 2) * ... * 1

建議在實作前先在紙上模擬

關鍵點:

  • 匿名函式:函式表達式中的函式可以沒有名字(像第一個範例的 function(name)),這就是匿名函式。
  • 無 Hoisting:因為是賦值給變數,只有變數宣告會被 Hoisting,函式本身不會。
  • 範例(證明無 Hoisting):
console.log(sayBye("Eve")); // 錯誤: sayBye is not a function

const sayBye = function(name) {
return `Bye, ${name}!`;
};

3. 回呼函式 (Callback Function)

回呼函式是作為參數傳遞給另一個函式的函式,通常用於非同步操作(像是計時器、事件處理或 API 請求)。它讓程式可以在某個任務完成後「回頭呼叫」執行你的函式。白話一點的說是時機到了才會召喚他出來。

參考連結:MDN Web

真實場景(setTimeout):

function delayedGreeting(name) {
console.log(`Hello, ${name}!`);
}

setTimeout(function() {
delayedGreeting("Grace");
}, 5000); // 5秒後輸出: Hello, Grace!

關鍵點:

  • 回呼函式通常是匿名函式(像 setTimeout 範例),但也可以是有名字的函式(像 greetCallback)。
  • 它們是 JS 非同步 coding 的基礎,像是事件監聽器 (addEventListener) 或 Promise 處理。

稍微認識這些函式後,我們進到正式的作階段(Creation Phase)和執行階段(Execution Phase)。

1. 創作階段(Creation Phase)

像是 JS 幫你「排座位、先貼名牌」的準備期。

它會做三件事:

  1. 建立 global object(像是 windowglobal)讓後面的程式都可以用。
  2. 建立 this(在 global 是指 global object)
  3. 先掃過所有變數和函式宣告

所以:

  • 函式會整個搬到上面(可以先呼叫)
  • var 的變數會「被提升」但值是 undefined
  • let / const 會進入「暫時性死區」不可以偷看(還沒貼名牌)

2. 執行階段(Execution Phase)

開始照順序跑你的程式碼、做事情,這時候才會給變數真正的值,跑邏輯、算式、執行函式。

運作的方式是

console.log(x); // undefined 還沒讀到x是誰
var x = 10;

sayHi(); // ✅

function sayHi() {
console.log("嗨!");
}
  • 發現 var x,貼名牌但值是 undefined
  • 發現 function sayHi(),整個搬上來了

執行階段:

  • console.log(x) 👉 印出 undefined
  • 然後 x = 10
  • 呼叫 sayHi() 👉 印出「嗨!」

最後小試身手 (請AI出題釐清觀念)

  1. 哪些函式先被 JS 貼名牌(創作階段)?
  2. 哪些會在程式跑的時候被呼叫(執行階段)?
  3. 函式裡的函式是怎麼被呼叫的(callback)?
function first(cb) {
console.log("1. 我是 first");
cb();
}

function second() {
console.log("2. 我是 second");
}

console.log("0. 開始");

first(second);

console.log("3. 全部結束");

我有點猜錯,我對於first(second);的運作還不熟悉,一開始沒有理解cd()是怎麼傳遞。來看一下解答:

  • 創作階段:
    • JS 掃過 function first(cb),貼名牌 first
    • JS 掃過 function second(),貼名牌 second
  • 執行階段:
    • 從 console.log("0. 開始") 開始跑
    • 呼叫 first(second):把 second 當參數傳給 cb
    • first 裡印出 "1. 我是 first",然後 cb() 被呼叫,其實就是 second()
    • 所以印出 "2. 我是 second"
    • 然後跑到 console.log("3. 全部結束")


留言
avatar-img
留言分享你的想法!
avatar-img
越南放大鏡 X 下班資工系
28會員
84內容數
雙重身份:越南放大鏡 X 下班資工系 政大東南亞語言學系是我接觸越南語的起點,畢業後找越南外派工作的生活跟資訊時,發現幾乎都是清單式的分享,很難身歷其境。所以我希望「越南放大鏡」可以帶讀者看到更多細節和深入的觀察。 - 下班資工系則是自學資工系的課程內容,記錄實際操作的過程,學習理論的過程。希望可以跟讀者一起成長。
2025/05/23
這篇文章提供 JavaScript 的基礎教學,涵蓋變數、作用域、資料型別、以及常見的錯誤與陷阱。以淺顯易懂的白話文搭配程式碼範例,幫助讀者快速掌握 JavaScript 的核心概念。
Thumbnail
2025/05/23
這篇文章提供 JavaScript 的基礎教學,涵蓋變數、作用域、資料型別、以及常見的錯誤與陷阱。以淺顯易懂的白話文搭配程式碼範例,幫助讀者快速掌握 JavaScript 的核心概念。
Thumbnail
2025/04/24
本系列文章將循序漸進地介紹 JavaScript 的核心概念,從基礎語法到進階應用,例如非同步程式設計和 React 基礎。內容淺顯易懂,並使用生活化的比喻幫助讀者理解,搭配程式碼範例,適合 JavaScript 初學者學習。
Thumbnail
2025/04/24
本系列文章將循序漸進地介紹 JavaScript 的核心概念,從基礎語法到進階應用,例如非同步程式設計和 React 基礎。內容淺顯易懂,並使用生活化的比喻幫助讀者理解,搭配程式碼範例,適合 JavaScript 初學者學習。
Thumbnail
2025/04/21
本文介紹行動通訊網路的演進歷史,從1G到5G,並說明ITU與3GPP在制定通訊規格上的重要角色,以及5G的三大關鍵應用場景:URLLC、eMBB和mMTC。
Thumbnail
2025/04/21
本文介紹行動通訊網路的演進歷史,從1G到5G,並說明ITU與3GPP在制定通訊規格上的重要角色,以及5G的三大關鍵應用場景:URLLC、eMBB和mMTC。
Thumbnail
看更多
你可能也想看
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
這篇內容,將會講解什麼是函式,以及與函式相關的知識。包括函式的簡介、Runtime Function、自訂函式、Script Function 腳本函式、Method 方法。
Thumbnail
這篇內容,將會講解什麼是函式,以及與函式相關的知識。包括函式的簡介、Runtime Function、自訂函式、Script Function 腳本函式、Method 方法。
Thumbnail
在這一章中,我們探討了 PHP 中的函數,包括函數的基本結構、不同的函數定義方式(如函數聲明、函數表達式、箭頭函數和匿名函數)以及如何呼叫函數。我們還討論了函數的參數處理方式,包括單個參數、多個參數、預設參數值和剩餘參數。此外,我們還介紹了函數的返回值,包括返回單個值、返回物件和返回函數的情況。
Thumbnail
在這一章中,我們探討了 PHP 中的函數,包括函數的基本結構、不同的函數定義方式(如函數聲明、函數表達式、箭頭函數和匿名函數)以及如何呼叫函數。我們還討論了函數的參數處理方式,包括單個參數、多個參數、預設參數值和剩餘參數。此外,我們還介紹了函數的返回值,包括返回單個值、返回物件和返回函數的情況。
Thumbnail
本章節旨在介紹TypeScript中的函數,包括其基本結構、如何呼叫函數、函數的參數以及函數的返回值等相關概念。通過本章節,讀者可以學習到如何在TypeScript中使用不同的方式來定義函數,如函數聲明、函數表達式、箭頭函數和匿名函數等。
Thumbnail
本章節旨在介紹TypeScript中的函數,包括其基本結構、如何呼叫函數、函數的參數以及函數的返回值等相關概念。通過本章節,讀者可以學習到如何在TypeScript中使用不同的方式來定義函數,如函數聲明、函數表達式、箭頭函數和匿名函數等。
Thumbnail
Function的使用方式
Thumbnail
Function的使用方式
Thumbnail
本章節旨在介紹TypeScript的基本語法,包括一般結構、程式進入點、註解以及變數的定義和賦值。這些知識將幫助讀者瞭解TypeScript的基本架構,並且可以開始使用TypeScript進行開發。
Thumbnail
本章節旨在介紹TypeScript的基本語法,包括一般結構、程式進入點、註解以及變數的定義和賦值。這些知識將幫助讀者瞭解TypeScript的基本架構,並且可以開始使用TypeScript進行開發。
Thumbnail
JavaScript (簡稱 JS) 是具有一級函數的輕量級、直譯式或即時編譯的程式語言。它因為用作網頁的腳本語言而大為知名,但也用於許多非瀏覽器的環境,像是 Node.js 等。由於 JavaScript 語法上的一些缺點,軟體工程師們又設計出了 CoffeeScript、TypeScript 和
Thumbnail
JavaScript (簡稱 JS) 是具有一級函數的輕量級、直譯式或即時編譯的程式語言。它因為用作網頁的腳本語言而大為知名,但也用於許多非瀏覽器的環境,像是 Node.js 等。由於 JavaScript 語法上的一些缺點,軟體工程師們又設計出了 CoffeeScript、TypeScript 和
Thumbnail
JavaScript是一種具有動態型別、弱型別、原型繼承等特性的高級腳本語言,應用範圍廣泛,包括前端開發、後端開發、移動應用等。它被各種公司和開源社區廣泛使用。學習JavaScript需要掌握ECMAScript標準、異步編程、模塊系統等知識。
Thumbnail
JavaScript是一種具有動態型別、弱型別、原型繼承等特性的高級腳本語言,應用範圍廣泛,包括前端開發、後端開發、移動應用等。它被各種公司和開源社區廣泛使用。學習JavaScript需要掌握ECMAScript標準、異步編程、模塊系統等知識。
Thumbnail
本章節旨在介紹 C# 中函數的基本結構,包括訪問修飾符、返回類型、方法名稱、參數列表和方法體。同時,也介紹了函數的各種呼叫方式、參數傳遞方式和返回值類型。讀者可以通過本章節,深入理解 C# 中函數的使用和應用。
Thumbnail
本章節旨在介紹 C# 中函數的基本結構,包括訪問修飾符、返回類型、方法名稱、參數列表和方法體。同時,也介紹了函數的各種呼叫方式、參數傳遞方式和返回值類型。讀者可以通過本章節,深入理解 C# 中函數的使用和應用。
Thumbnail
針對 JavaScript 中的原始型別和隱性轉型進行了詳細的探討
Thumbnail
針對 JavaScript 中的原始型別和隱性轉型進行了詳細的探討
Thumbnail
立即(調用)函式 (簡稱 IIFE,Immediately Invoked Function Expression) 是種在定義完可以馬上執行的函式表達式。
Thumbnail
立即(調用)函式 (簡稱 IIFE,Immediately Invoked Function Expression) 是種在定義完可以馬上執行的函式表達式。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News