我有一个涉及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
};
};
}
我无法区分“杂质”的任何来源。是因为未简化的代码引入了它,还是因为函数将返回带有两个不同引用的两个不同对象?
简化的代码不会引入杂质。杂质来自以下事实:如果未指定该参数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)
不是。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句