Javascript currying柯里化詳細解
2919 ワード
面接問題:add(1)(2)(3)/結果=6を実現し、問題の核心は質問のjsのコリック化です.
まず、コリゼーションとは何かを話してください.コリゼーションに関する多くの文章を見ましたが、いつもよく分かりません.例えば、カリー化は複数のパラメータを受け取る関数を単一のパラメータ(最初の関数の最初のパラメータ)を受け入れる関数に変換し、残りのパラメータを受け取って結果を返す新しい関数の技術です.大多数のブログはこのような言い方です.正直に言うと、私は愚かです.私の理解では、curryはパラメータを集める方法であり、実行関数を収集するのに十分である.
実現する前にまずポイントを書きます.1、パラメータを集める(面接問題のように複数のパラメータを複数回実行する)ことは、クローズドを利用することです.2、実行するたびにパラメータがどれぐらいありますか?例えば、add(1)(2、3)(4)3、いつパラメータが足りますか?
しかし、タイトル党はできません.よく説明してください.次に、ネット上の大多数のコリ化の実現コードを解析します.
もう一つの例:bind方法の実現
まず、コリゼーションとは何かを話してください.コリゼーションに関する多くの文章を見ましたが、いつもよく分かりません.例えば、カリー化は複数のパラメータを受け取る関数を単一のパラメータ(最初の関数の最初のパラメータ)を受け入れる関数に変換し、残りのパラメータを受け取って結果を返す新しい関数の技術です.大多数のブログはこのような言い方です.正直に言うと、私は愚かです.私の理解では、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...