関数(純粋関数, 再帰関数, 高階関数, クロージャー)

一歩進んだ関数の使い方について解説します。「再利用しやすい関数」「処理を自由に変更できる関数」を作るために、必要な知識となります。

なお、関数の基本的な記述方法は こちら にて取り上げています。

純粋関数

純粋関数と呼ばれる関数が存在します。純粋関数には、以下特徴があります。

  • プログラムの状態を変えない。
    • グローバル変数の状態
    • DOMの状態
    • 画面出力の状態
    • DBの状態
  • 同じ入力に対して、同じ出力を返す。

純粋関数のメリットは以下の通りです。

  • テストしやすい
  • 再利用性が高い

純粋な関数不純な関数 を意識して、なるべく純粋関数が増えるような実装を心がけることが勧められています。

再帰関数

関数内で自分自身の関数を呼び出す関数再帰関数と呼びます。

以下、階乗を計算する関数を再帰関数を利用して実装した例になります。

factorial = num => {
  if (num < 0) {
    return -1
  } else if (num == 0) {
    return 1
  } else {
    return (num * factorial(num - 1))
  }
}

console.log(factorial(-10))  // -1
console.log(factorial(0))    // 1
console.log(factorial(4))    // 24

高階関数

他の関数を引数として受け取れる関数高階関数 と呼びます。

ope = (x, y, cb) => {
  return cb(x, y)
}

console.log(ope(2, 4, (a, b) => a + b))  // 6
console.log(ope(2, 4, (a, b) => a * b))  // 8

上記例では、第3引数に指定する関数によって処理内容が変わっています。

このように、高階関数 を利用すると処理を自由にカスタマイズできるメリットがあります。

cb に指定する関数は、後から呼び出される関数になるので コールバック関数 と呼びます。

(a, b) => a + b のように名前の無い関数を 無名関数 と呼びます。
今回のように、使い捨ての関数は無名関数にするとコードがシンプルになります。

クロージャー

関数内のローカル変数は、関数の処理終了後に破棄されます。これを維持するための仕組みがクロージャーです。

clousure = () => {
  let x = 1
  return function () {
    return x++
  }
}
var f = clousure()
console.log(f())  // 1
console.log(f())  // 2
console.log(f())  // 3

「ローカル変数を参照している関数」を返す関数を定義してますが、これがクロージャになります。

「clousure関数のローカル変数を参照している無名関数」が「f関数」に格納され続けているため「f関数」がローカル変数を維持し続けています。

クロージャーの仕組みは、プライベート変数を作るのに利用されます。

わくわくBank.
フリーランスのエンジニアとして活動してます。ここでは、ソフトウェア開発で必要とされる技術、用語、概念を整理しています。

JavaScriptに関連する書籍 (Amazon)