JavaScript | 関数で受け取る引数の数を取得する

JavaScript JavaScript
スポンサーリンク

ここでは、未指定の引数を他の関数やデータから「推論」して自動注入する仕組みを作ります。いわゆる「スマートデフォルト自動補完」のイメージです。

完全に自動推論は AI が必要ですが、ここでは 関数の依存関係マップやルールベースで自動注入する形で再現します。


例の設計方針

  1. 関数の定義fn.length で必要な引数数を確認する
  2. 未指定の引数は、resolverMap という「どの関数・どの引数に何を注入するか」を定義したマップから取得
  3. resolver関数が指定されていれば、動的に生成(推論)して注入
  4. 実際の呼び出しでは、渡された引数 + 推論値で呼び出す

コード例:依存関係から自動注入

// ===== Resolverマップ =====
// key: 関数名_引数インデックス
// value: 値 or 関数で生成
const resolverMap = {
  "greet_0": () => "Guest",            // nameが未指定なら"Guest"
  "greet_1": (args) => args[0] ? "Hello" : "Hi",  // messageはname次第で決定
  "calculate_1": (args) => args[0] * 2 // bはaの2倍をデフォルト
};

// ===== スマートラッパー =====
function smartWrapper(fn, resolverMap) {
  return function(...args) {
    const expected = fn.length;

    while (args.length < expected) {
      const key = `${fn.name}_${args.length}`;
      const resolver = resolverMap[key];
      let value = null;

      if (typeof resolver === "function") {
        value = resolver(args); // 既存の args を渡して推論
      } else if (resolver !== undefined) {
        value = resolver;
      }

      args.push(value);
    }

    return fn(...args);
  };
}

// ===== テスト関数 =====
function greet(name, message) {
  return `${message}, ${name}!`;
}

function calculate(a, b) {
  return a + b;
}

// ===== ラップ =====
const smartGreet = smartWrapper(greet, resolverMap);
const smartCalc = smartWrapper(calculate, resolverMap);

// ===== 呼び出し =====
console.log(smartGreet());            // → Hello, Guest!
console.log(smartGreet("Taro"));      // → Hello, Taro!
console.log(smartGreet(undefined));   // → Hi, Guest! (args[0]が undefinedとみなされる)

console.log(smartCalc(5));            // → 5 + 10 = 15 (b = a*2 で推論)
console.log(smartCalc(3, 7));         // → 10 (指定値優先)
JavaScript

ポイント解説

  1. 依存関係を活かす
    • 例:calculate_1args[0] を利用して b を推論
    • greet では name があるかどうかで message を変える
  2. resolver関数は引数 args を受け取ることで、呼び出し時のコンテキストを参照できる
  3. defaultだけじゃなく、推論値を注入することで「かなり柔軟な自動補完」が可能
  4. 未指定 or undefined の場合のみ推論するように調整するとより安全

応用アイデア

  • Webフォーム入力補完
    • 未入力のフィールドを過去の値や他フィールドから自動補完
  • API 呼び出しラッパー
    • 省略可能なパラメータを前後の呼び出しやキャッシュから推論
  • テスト自動生成
    • 引数を自動で推論して関数を呼び出すテストフレームワーク

💡 この仕組みをさらに進化させると:

  • **AI推論ライブラリ(GPTなど)**に args を渡して、自然言語や履歴データから自動生成された値を注入できる
  • 依存関係グラフを解析して、関数チェーン全体にデフォルト値を流し込む
タイトルとURLをコピーしました