レッスンに戻る

括弧の量が任意の合計

重要度: 2

次のように動作するsum関数を作成します。

sum(1)(2) == 3; // 1 + 2
sum(1)(2)(3) == 6; // 1 + 2 + 3
sum(5)(-1)(2) == 6
sum(6)(-1)(-2)(-3) == 0
sum(0)(1)(2)(3)(4)(5) == 15

ヒント: 関数用にカスタムオブジェクトをプリミティブに変換する必要がある場合があります。

テスト付きサンドボックスを開く.

  1. とにかくすべてが機能するために、sumの結果は関数でなければなりません。
  2. その関数は、呼び出し間で現在の値をメモリに保持する必要があります。
  3. タスクによると、関数は==で使用されると数値にならなければなりません。関数はオブジェクトなので、変換はオブジェクトからプリミティブに変換する章で説明されているとおりに行われ、数値を返す独自のメソッドを提供できます。

これでコード

function sum(a) {

  let currentSum = a;

  function f(b) {
    currentSum += b;
    return f;
  }

  f.toString = function() {
    return currentSum;
  };

  return f;
}

alert( sum(1)(2) ); // 3
alert( sum(5)(-1)(2) ); // 6
alert( sum(6)(-1)(-2)(-3) ); // 0
alert( sum(0)(1)(2)(3)(4)(5) ); // 15

sum関数は実際には1回だけ機能することに注意してください。関数fを返します。

その後、後続の各呼び出しで、fはパラメーターを合計currentSumに加えて、自身を返します。

fの最後の行に再帰はありません。

再帰は以下のようになります。

function f(b) {
  currentSum += b;
  return f(); // <-- recursive call
}

そして私たちの場合、それを呼び出さずに、ただ関数を返します。

function f(b) {
  currentSum += b;
  return f; // <-- does not call itself, returns itself
}

このfは次の呼び出しで使用され、また自身を返し、必要な回数だけ繰り返されます。次に、数値または文字列として使用されると、toStringcurrentSumを返します。変換のためにSymbol.toPrimitiveまたはvalueOfを使用することもできます。

サンドボックス内でテスト付きのソリューションを開く.