JavaScript 函式:定義、呼叫與參數引數的差別
函式是構成 JavaScript 的基本要素之一,忘記的話,請看 JavaScript 的語法構成 這篇文章。
一個函式本身就是一段 JavaScript 程序,包含用於執行某一個任務或計算的語法。有時亦可將多段要執行的事項包裝起來。在呼叫某個函式之前,必須要先在這個函式要執行的範圍中定義它。
函式的定義
- 關鍵字:
function。 - 自定義的函式名稱:
todo。有時也有可能沒有。 - 小括號:
()。 - 大括號:
{}。 - 欲執行的工作事項放在
{}中。
function todo() {
// 執行的第一個事項
// 執行的第二個事項
// 執行的第三個事項
}小提醒
函式名稱建議用 動詞開頭,例如:getSum、showMsg、updateTitle,一看就知道它做什麼事。
函式的呼叫
準備好的函式並不會自動執行,必須呼叫它才會執行,呼叫 1 次就執行 1 次,呼叫 100 次便執行 100 次。todo() 便是呼叫函式執行。
function todo() {
// 執行的第一個事項
// 執行的第二個事項
// 執行的第三個事項
}
todo();注意
todo 與 todo() 是兩件事:前者是函式 本身,後者是 執行它。把函式交給 事件監聽器 時要寫前者,寫成後者會在綁定的當下就先執行掉。
函式的參數與引數
參數
Line 1:() 中的內容稱作 參數,可以是一個或多個的形式出現,它們之間以 , 進行分隔。
引數
Line 7:calc(10, 5) 為呼叫 calc 函式,() 中的內容稱作 引數,它們之間以 , 進行分隔,也是呼叫函式時所傳遞的值。
function calc(x, y) {
const total = x + y;
console.log(total);
}
calc(10, 5);引數傳少了會怎樣
沒收到值的參數會是 undefined,程式不會報錯,但運算結果通常會變成 NaN:
function calc(x, y) {
// 10 + undefined = NaN
console.log(x + y);
}
calc(10);用 預設參數 給它一個備用值就安全了:
function calc(x, y = 0) {
// 10
console.log(x + y);
}
calc(10);arguments 取得全部的參數
我們也可以在函式中利用 arguments 這個變數來取出所有傳入函式中的值。
function calc() {
// [10, 5]
console.log(arguments);
}
calc(10, 5);arguments 是個 類陣列,故無法使用陣列內建的方法。
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),它一開始就是陣列:
function calc(...nums) {
// [10, 5, 3]
console.log(nums);
// 18
console.log(nums.reduce((total, num) => total + num, 0));
}
calc(10, 5, 3);把結果回傳出來
函式除了做事,也可以把結果交回呼叫它的地方,這件事由 return 負責,詳細比較請看 其他函式寫法:
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,需要收集不定數量的引數時,請改用其餘參數的寫法。