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