2

cyclejsコンポーネントを参照する (かなり哲学的な) 質問があります。isolate() は参照透過性ですか? .

その後に再現された単純化されたコードを見ると、「不純物」の原因を識別することができませんでした。それは単純化されていないコードがそれを導入しているためですか、それとも関数が 2 つの異なる参照を持つ 2 つの異なるオブジェクトを返すためですか?

その場合、これらの 2 つのオブジェクトは同じ動作をしません (つまり、同じターゲットで同じイベントをリッスンして反応し、異なる vTree$ を生成しますが、まったく同じシーケンスをカプセル化しますか?)。もしそうなら、これらの 2 つのオブジェクトは本質的に同じではないでしょうか? つまり、プログラムのどこかで一方を他方に置き換えても何も変わらないはずです。isolate参照透過性とはどのような意味ですか? どこで私は間違えましたか?

実際、両方の呼び出しが代入できない異なるオブジェクトを返す場合、それらのオブジェクトはどのように異なるのでしょうか?

function isolate(Component, scope) {
  return function IsolatedComponent(sources) {
    const {isolateSource, isolateSink} = sources.DOM;
    const isolatedDOMSource = isolateSource(sources.DOM, scope);
    const sinks = Component({DOM: isolatedDOMSource});
    const isolatedDOMSink = isolateSink(sinks.DOM, scope);
    return {
      DOM: isolatedDOMSink
    };
  };
}
4

1 に答える 1

2

「不純物」の発生源を識別することはできませんでした。それは単純化されていないコードがそれを導入しているためですか、それとも関数が 2 つの異なる参照を持つ 2 つの異なるオブジェクトを返すためですか?

単純化されたコードは不純物を導入しません。scope不純物は、パラメーターが指定されていない場合にデフォルトになるという事実に由来しnewScope()ます。の実際の実装にisolate()は次のものがあります。

function isolate(dataflowComponent, scope = newScope()) {
  // ...
}

どこnewScope()にある:

let counter = 0

function newScope() {
  return `cycle${++counter}`
}

つまり、scopeが引数として指定されていない場合、デフォルトで、呼び出されるcounterたびにインクリメントされる隠しグローバルの次の値になります。isolate()

結論として、isolate(component, scope)は を与えるので参照透過ですscopeが、そうでisolate(component)はありません。

于 2016-01-01T11:21:37.243 に答える