Javascript currying柯里化詳細解


面接問題:add(1)(2)(3)/結果=6を実現し、問題の核心は質問のjsのコリック化です.
まず、コリゼーションとは何かを話してください.コリゼーションに関する多くの文章を見ましたが、いつもよく分かりません.例えば、カリー化は複数のパラメータを受け取る関数を単一のパラメータ(最初の関数の最初のパラメータ)を受け入れる関数に変換し、残りのパラメータを受け取って結果を返す新しい関数の技術です.大多数のブログはこのような言い方です.正直に言うと、私は愚かです.私の理解では、curryはパラメータを集める方法であり、実行関数を収集するのに十分である.
実現する前にまずポイントを書きます.1、パラメータを集める(面接問題のように複数のパラメータを複数回実行する)ことは、クローズドを利用することです.2、実行するたびにパラメータがどれぐらいありますか?例えば、add(1)(2、3)(4)3、いつパラメータが足りますか?
        //  
        //add(1)(2)(3)
        //       add(1)      1        2          。
       function curry(fn) {
            let arg = []; //      
            //     https://segmentfault.com/a/1190000017824877
            return function() {
                //           ,    concat            (2,3)
                arg = arg.concat([...arguments]);
                //          fn
                //               ,    curry  fn      fn.length
                //             fn       fn,        
                if (arg.length >= fn.length) {
                    return fn(...arg)
                }
                //                ,  
                return arguments.callee
            }
        }

        //     
        let testAdd = curry(add1)
        // console.log(testAdd(1)(2)(3))
        // console.log(testAdd(1, 2)(3))
        //console.log(testAdd(1)(2, 3))
うっかり書き終わりました.
しかし、タイトル党はできません.よく説明してください.次に、ネット上の大多数のコリ化の実現コードを解析します.
function curry(fn) {
  function _c(restNum, argsList) {
    return restNum === 0 ?
      fn.apply(null, argsList) :
      function(x) {
        return _c(restNum - 1, argsList.concat(x));
      };
  }
  return _c(fn.length, []);
}
目で見ても大丈夫です.私達は多く見ます.解析:1、curryも一つのパラメータ(fn)を受信します.これは必然的に2、一つの関数を返して、二つのパラメータを受信します.fn.lengthと一つの空配列という説明があります.私が書いた簡版も言っていました.fn.lengthはパラメータが収集されているかどうかを判断するために、パラメータ転送の空配列も実はクローズドパッケージの一つの実現です.3、中は3つの目で判断します.花里胡笛を見ているのはそんなに複雑ではありません.fnのパラメータの個数が0なら、fnを直接実行する必要はありません.fn.apply(null、argList)については分かります.大声で言ったら、アプリを使ってあちこち使いますか?私は一銭の使い道がないと思いますが、argListは行列なので、ちょうどapplyが第二のパラメータをサポートしています.行列です.主に牛が強いように見えます.4、パラメータを収集して、fnパラメータの個数はゼロではなく、毎回fn関数パラメータの個数を集めて、0に等しいまでfnを実行します.これは私の書いたものが通用しなくなります.一回に二人を伝えたら切ってしまいます.
もう一つの例:bind方法の実現
Function.prototype.bind = function(context) {
            //      this   ,        this
            let self = this
                //          ,    
            let arg = [...arguments].slice(1)
                //       
            return function() {
                //                         
                let newArg = [...arguments]
                console.log(newArg)
                    //       this,         
                    //            return
                return self.apply(context, arg.concat(newArg))
            }
        }

        //     
        let fn = Person.say.bind(Person1)
        fn()
        fn(18)
はい、bindメソッドはコリック化で、bind実装の詳細はステップを移動してください.https://segmentfault.com/a/11...