Skip to content

JavaScript 函式:定義、呼叫與參數引數的差別

函式的構成:定義、呼叫與參數

函式是構成 JavaScript 的基本要素之一,忘記的話,請看 JavaScript 的語法構成 這篇文章。

一個函式本身就是一段 JavaScript 程序,包含用於執行某一個任務或計算的語法。有時亦可將多段要執行的事項包裝起來。在呼叫某個函式之前,必須要先在這個函式要執行的範圍中定義它。

函式的定義

  1. 關鍵字:function
  2. 自定義的函式名稱:todo。有時也有可能沒有。
  3. 小括號:()
  4. 大括號:{}
  5. 欲執行的工作事項放在 {} 中。
js
function todo() {
  // 執行的第一個事項
  // 執行的第二個事項
  // 執行的第三個事項
}

小提醒

函式名稱建議用 動詞開頭,例如:getSumshowMsgupdateTitle,一看就知道它做什麼事。

函式的呼叫

準備好的函式並不會自動執行,必須呼叫它才會執行,呼叫 1 次就執行 1 次,呼叫 100 次便執行 100 次。todo() 便是呼叫函式執行。

js
function todo() {
  // 執行的第一個事項
  // 執行的第二個事項
  // 執行的第三個事項
}

todo();

注意

todotodo() 是兩件事:前者是函式 本身,後者是 執行它。把函式交給 事件監聽器 時要寫前者,寫成後者會在綁定的當下就先執行掉。

函式的參數與引數

參數

Line 1:() 中的內容稱作 參數,可以是一個或多個的形式出現,它們之間以 , 進行分隔。

引數

Line 7:calc(10, 5) 為呼叫 calc 函式,() 中的內容稱作 引數,它們之間以 , 進行分隔,也是呼叫函式時所傳遞的值。

js
function calc(x, y) {
  const total = x + y;

  console.log(total);
}

calc(10, 5);

引數傳少了會怎樣

沒收到值的參數會是 undefined,程式不會報錯,但運算結果通常會變成 NaN

js
function calc(x, y) {
  // 10 + undefined = NaN
  console.log(x + y);
}

calc(10);

預設參數 給它一個備用值就安全了:

js
function calc(x, y = 0) {
  // 10
  console.log(x + y);
}

calc(10);

arguments 取得全部的參數

我們也可以在函式中利用 arguments 這個變數來取出所有傳入函式中的值。

js
function calc() {
  // [10, 5]
  console.log(arguments);
}

calc(10, 5);

arguments 是個 類陣列,故無法使用陣列內建的方法。

js
function calc() {
  // [10, 5]
  console.log(arguments);
  // 10
  console.log(arguments[0]);
  // 5
  console.log(arguments[1]);
  // 15
  console.log(arguments[0] + arguments[1]);
}

calc(10, 5);

類陣列 → 陣列

  • Array.from:Array.from(arguments)
  • ES6 展開運算子:[...arguments]

其餘參數:現代的做法

arguments箭頭函式 中不存在,且本身不是真正的陣列。現在更建議用 其餘參數(Rest Parameters),它一開始就是陣列:

js
function calc(...nums) {
  // [10, 5, 3]
  console.log(nums);

  // 18
  console.log(nums.reduce((total, num) => total + num, 0));
}

calc(10, 5, 3);

把結果回傳出來

函式除了做事,也可以把結果交回呼叫它的地方,這件事由 return 負責,詳細比較請看 其他函式寫法

js
function getSum(x, y) {
  return x + y;
}

const total = getSum(10, 5);

// 15
console.log(total);

常見問題

參數與引數有什麼差別?

參數是定義函式時括號內的名稱,像是預留的空位;引數是呼叫函式時實際傳進去的值。簡單記:定義時叫參數,呼叫時叫引數。

為什麼函式寫好了卻沒有執行?

因為函式必須被呼叫才會執行。定義只是把工作準備好,加上括號例如:todo() 才真正跑一次,呼叫幾次就執行幾次。

傳入的引數比參數少會怎樣?

沒收到值的參數會是 undefined,程式不會報錯,但運算結果可能變成 NaN。可以用預設參數的寫法給它一個備用值。

arguments 是陣列嗎?

不是,它是 類陣列,有 length 也能用索引取值,但沒有陣列方法。要用陣列方法請先以 Array.from() 或展開運算子轉換。

箭頭函式裡也有 arguments 嗎?

沒有。箭頭函式不提供自己的 arguments,需要收集不定數量的引數時,請改用其餘參數的寫法。

延伸閱讀