質問: javascriptで下記の様な事は出来るでしょうか。 名前が同じで、引数の数が違う関数です。 ``` //合計の計算 function calcSum(n1, n2){ return n1 + n2; } //合計の計算 function calcSum(n1, n2, n3){ return n1 + n2 + n3; } ```
回答: ### 多重定義 JavaScriptに**多重定義**の仕組みはない為、可変引数コード実装時に使われる機構を活用することになります。 多重定義と同様に関数を分割定義したいのならば、多重定義用の関数を一つ用意してやる必要があります。 ``` function calcSum (n1) { switch(arguments.length) { case 0: throw new Error; case 1: return n1; case 2: return calcSum2(n1, arguments[0]); case 3: return calcSum3(n1, arguments[0], arguments[1]); } throw new Error; } function calcSum2 (n1, n2){ return n1 + n2; } function calcSum3 (n1, n2, n3){ return n1 + n2 + n3; } console.log(calcSum(1)); // 1 console.log(calcSum(1, 2)); // 2 console.log(calcSum(1, 2, 3)); // 4 console.log(calcSum(1, 2, 3, 4)); // Error console.log(calcSum()); // Error ``` ここで重要なのは、 ``` calcSum.length === 1; // true ``` であり、最低一つの引数を要求する事が明確になっている点です。 `arguments` を使って実引数を参照する事で、 `Function#length` の値をコントロール出来ます。 なお、ES6 の **Rest parameters** で同様の実装をするには、次のように書きます。 ``` function calcSum (n1, ...n) {} console.log(calcSum.length); // 1 ``` Re: uer03108 さん