我有一个(相当哲学的)问题,提到cyclejs
组件:Is isolate() referentially transparent?。
查看之后复制的简化代码,我无法区分任何“杂质”来源。这是因为非简化代码引入它,还是因为函数会返回两个不同的对象和两个不同的引用?
在这种情况下,这两个对象不会具有相同的行为(即,监听和响应同一目标上的相同事件,并生成不同的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
};
};
}
答案 0 :(得分:2)
我无法区分任何“杂质”来源。这是因为非简化代码引入它,还是因为函数会返回两个不同的对象和两个不同的引用?
简化代码不会引入杂质。如果未指定参数scope
默认为newScope()
,则该杂质来自这一事实。 The actual implementation of isolate()
有:
function isolate(dataflowComponent, scope = newScope()) {
// ...
}
newScope()
的位置:
let counter = 0
function newScope() {
return `cycle${++counter}`
}
意思是,如果scope
未作为参数给出,则默认为隐藏全局counter
的下一个值,每次调用isolate()
时都会递增。
总之,isolate(component, scope)
是引用透明的,因为我们提供scope
,但isolate(component)
不是。