2

我有一个(相当哲学的)问题涉及cyclejs组件:isolate() 引用透明吗?.

查看此后复制的简化代码,我无法区分任何“杂质”来源。那是因为未简化的代码引入了它,还是因为该函数将返回具有两个不同引用的两个不同对象?

在那种情况下,这两个对象不会有相同的行为(即在相同的目标上侦听和响应相同的事件,并产生不同的 vTree$ 但封装完全相同的序列?)。如果是这样,这两个对象不是本质上相同吗,即在程序中的任何地方用另一个替换一个不应该改变任何东西?哪种方式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

我无法区分任何“杂质”的来源。那是因为未简化的代码引入了它,还是因为该函数将返回具有两个不同引用的两个不同对象?

简化的代码不会引入杂质。杂质来自参数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 回答