10種類の定義方法

JavaScriptでは関数の定義方法は多少細かく分けると10種類ほどもある。さらに次項目のアクセサも関数のように振る舞う。

// 関数の定義方法は様々あり、挙動も少し異なる (本体はここでは空)
// 10種類の定義方法

// 1. 関数宣言
function 関数宣言(引数) { /*本体*/ }

// 2. 関数式
// 式の中で定義でき、ここでは変数に代入(以降同様)
const 名前付き関数式 = function 関数式(引数) { /*本体*/ }
const 匿名関数 = function(引数) { /*本体*/ }

// 3. アロー関数
const アロー関数 = (引数) => { /*本体*/ }

// 4. クラス宣言
class クラス宣言 { /*本体*/ }

// 5. クラス式
const 名前付きクラス式 = class クラス式 { /*本体*/ }
const 匿名クラス = class { /*本体*/ }

// 6. ジェネレータ宣言
function* ジェネレータ宣言(引数) { /*本体*/ }

// 7. ジェネレータ式
const 名前付きジェネレータ式 = function* ジェネレータ式(引数) { /*本体*/ }
const 匿名ジェネレータ = function*(引数) { /*本体*/ }

// 8. メソッド簡易記法
const メソッド簡易記法 = {
  メソッド() { /*本体*/ },
  *ジェネレータ() { /*本体*/ }
}

// 9. Functionコンストラクタ
const コンストラクタから関数 = new Function('引数', '/*本体*/')

// 10. GeneratorFunctionコンストラクタ
const GeneratorFunction = Object.getPrototypeOf(function*() {}).constructor
const コンストラクタからジェネレータ = new GeneratorFunction('引数', '/*本体*/')

// 関数か判定
let 関数 = [
  関数宣言, 名前付き関数式, 匿名関数, アロー関数,
  クラス宣言, 名前付きクラス式, 匿名クラス,
  ジェネレータ宣言, 名前付きジェネレータ式, 匿名ジェネレータ,
  メソッド簡易記法.メソッド, メソッド簡易記法.ジェネレータ,
  コンストラクタから関数, コンストラクタからジェネレータ
]
let 全部関数なの = 関数.every((e) => typeof e === 'function')
console.log(全部関数なの) // true
  1. 関数のようなアクセサ
  2. 関数宣言
  3. 関数式
  4. アロー関数
  5. クラス宣言
  6. クラス式
  7. ジェネレータ宣言
  8. ジェネレータ式
  9. メソッド簡易記法
  10. Functionコンストラクタ
  11. GeneratorFunctionコンストラクタ