2017-05-17 10 views
6

私はクロージャーが分かっていると思っていましたが、リアクションに関する記事を読んでいるとは分かりません。サンクとクロージャーの違い

以下の機能は「サンク」ですか? (私にとっては、私は約ブログ記事からこれを閉鎖取っています反応https://spin.atomicobject.com/2016/10/05/form-validation-react/

著者は説明する:「次は、のはruleRunner機能を見てみましょうruleRunnerは、サンク、または関数を返す関数です。」逆に

export const ruleRunner = (field, name, ...validations) => { 
    return (state) => { 
    for (let v of validations) { 
     let errorMessageFunc = v(state[field], state); 
     if (errorMessageFunc) { 
     return {[field]: errorMessageFunc(name)}; 
     } 
    } 
    return null; 
    }; 
}; 

私はサンクは思った「それは将来的にロジックのいくつかの並べ替えを行うために必要となるコンテキストのすべてが含まれている機能(状態、機能、など)。」 From:http://www.austinstory.com/what-is-a-thunk-in-javascript/

const add = (x,y) => x + y; 

const thunk =() => add(1,2); 

thunk() // 3 

最初の記事の著者が間違っている私にとってだから、彼はクロージャではないサンクの説明と例を与えています。しかし、私は間違っているかもしれないので、私はこの質問をしています。

サンクとは何かについて最初の記事の作者が間違っていて、サンクが運ぶために必要なすべてのコンテキスト(状態、関数など)を含む特定の種類のクロージャです。将来的に何らかの論理を出すことになる」と語った。

+1

サンクは、本質的にオンデマンドで機能を実行する引数のないクロージャのようなものです。処理する引数がなく本質的には「サンク」なので、「思考」はありません。私は、正式には、著者が間違っていると言うでしょう、それはサックではありません。それは閉鎖です。私はReduxの文脈でこれについてはわかりません。 – Li357

答えて

2

"ruleRunnerはサンク、または関数を返す関数です。"

いいえ、それはごみです。関数を返す関数はhigher-order functionと呼ばれます。 が返される関数は、多くの場合、closureです。

私は、サンクは「将来、何らかのロジックを実行するために必要なコンテキスト(状態、関数など)をすべて含む関数だと思っていました」

はい、それは妥当と思われます。これはクロージャーに似ていますが、クロージャーには通常さらにいくつかの引き数がありますが、thunkは実行されません。実行する必要があるだけです。

2

クローズは独立変数(ローカルで使用されているが、囲みスコープで定義されている変数)を参照する関数です。つまり、これらの関数は、作成された環境を「覚えている」ということです。要するに

は、閉鎖は、後で実行可能コードのブロックであるが、それが最初に作成された環境を維持し、したがってその範囲に囲まれました。 サンクはサブルーチンであり、サブルーチンは別のサブルーチンへの呼び出しを補助するために自動的に作成されるため、サンクはクロージャになることがありますが、すべてのサンクはクロージャではありません。

サンクは、ローカルまたはグローバルに囲むことができる簡単なヘルパー関数ですが、クロージャは初期化されたスコープにローカルでのみバインドされます。

+4

どこから引用していますか? – Bergi