0

私はクロージャーで次を作ろうとしています:

function func(number) {
    var result = number;

    var res = function(num) {
        return result + num;
    };
    return res;
}

var result = func(2)(3)(4)(5)(3);
console.log(result); // 17

2 + 3 + 4 + 5 + 3 = 17 を受け取る必要がありますが、エラーが発生しました: Uncaught TypeError: number is not a function

4

7 に答える 7

9

別の関数の代わりに結果番号を返すチェーンの終わりを何らかの方法で通知する必要があります。次の選択肢があります。

  • 一定回数関数を返すようにします。これが、あなたが持っているような構文を使用する唯一の方法ですが、退屈です。そのための@PaulSの答えを見てください。最初の呼び出し ( ) で、カリー化された引数のfunc(n)数を指定することができます。sum
  • 関数が引数なしで呼び出された場合(@PaulSの2番目の実装)または特別な値( null@AmoghTalpallikarの回答)で呼び出された場合など、特定の状況下で結果を返します。
  • 値を返す関数オブジェクトでメソッドを作成します。valueOf()関数がプリミティブ値にキャストされたときに呼び出されるため、最適です。実際に見てみましょう:

    function func(x) {
        function ret(y) {
            return func(x+y);
        }
        ret.valueOf = function() {
            return x;
        };
        return ret;
    }
    
    func(2) // Function
    func(2).valueOf() // 2
    func(2)(3) // Function
    func(2)(3).valueOf() // 5
    func(2)(3)(4)(5)(3) // Function
    func(2)(3)(4)(5)(3)+0 // 17
    
于 2013-08-05T20:22:54.127 に答える
8

機能を悪用しています。

func(2)関数を返しresます。
でその関数を呼び出すと、 ( 経由で)(3)数値が返されます。5return result + num

5は関数ではないため(4)、エラーが発生します。

于 2013-08-05T19:40:14.223 に答える
3

まあ、(2)(3)の部分は正しいです。func(2) を呼び出すresと、関数である you が返されます。しかし、(3) を呼び出すresと、数値である の結果が返されます。したがって、(4) を呼び出そうとすると問題が発生します。

あなたがやろうとしていることについて、Javascriptがあなたがチェーンの最後にいることをどのように予測し、関数の代わりに数値を返すことにしたかわかりません。オブジェクトのプロパティを使用して「結果」プロパティを持つ関数を返すこともできるかもしれませんが、ほとんどの場合、なぜこのようにしようとしているのかが気になります。明らかに、あなたの特定の例では、数字を足し合わせるのが最も簡単な方法ですが、何かをもう少し進めていると思います。

于 2013-08-05T19:42:52.873 に答える
0

呼び出し続けたい場合は、答えが必要になるまで関数を返し続ける必要があります。例: 5 回の呼び出し

function func(number) {
    var result = number,
        iteration = 0,
        fn = function (num) {
            result += num;
            if (++iteration < 4) return fn;
            return result;
        };
    return fn;
}
func(2)(3)(4)(5)(3); // 17

このように機能する、より長い長さの何かを行うこともできます

function func(number) {
    var result = number,
        fn = function () {
            var i;
            for (i = 0; i < arguments.length; ++i)
                result += arguments[i];
            if (i !== 0) return fn;
            return result;
        };
    return fn;
}
func(2)(3, 4, 5)(3)(); // 17
于 2013-08-05T19:46:02.030 に答える