我无法理解对象的数据分配何时是引用以及何时创建对象的副本。我以为我理解了,但下面的例子不符合我对它的简单理解。
事件处理程序开始以下一系列步骤。
Promise.allSettled( [ gather_write, get_build ] ).then( test );
承诺gather_write
并get_build
执行不相关的功能。第一个从 DOM 收集一些数据并将其写入数据库。第二个从数据库中检索数据并构建文档片段。如果两者都满足,则 DOM 中的节点将替换为片段。
此处显示的代码太多,但是get_build
,在成功从数据库中获取数据后,调用一个单独的函数来构建文档片段,并将其结果作为解析对象的属性返回。效果很好;然后我想尝试在gather_write
拒绝和get_build
履行的情况下向用户提供选项,这需要临时存储文档片段。因此,与其将其返回并将其传递回 ,不如将其Promise.allSettled
存储在构建它的函数的属性中。
在同步函数build
中,代码设置为:
function build()
{
let f;
try
{
f = document.createFragment();
// ...build the fragment...
build.html = f;
}
catch(e)
{ }
finally
{ f = null; }
} // close build
函数build
必须在 promiseget_build
可以解决之前完成,之后Promise.allSettled
可以评估;build.html
并且,如果两个 promise 都满足,则可以调用将 DOM 节点替换为存储在其中的新建片段的函数。我认为这build.html
将是对节点对象的引用,f
并且由于f
在块中设置为 null finally
,这将在上述所有内容完成之前发生,并且当build.html
最终运行要使用的代码时,它将指向 null而不是片段。所以,赋值语句应该是build.html = f.cloneNode(true)
.
但是,无论是否使用f.cloneNode
. 你能解释一下为什么吗?如果没有必要,我不希望浏览器采取步骤克隆片段,但是在不理解为什么它在不克隆的情况下工作的情况下犹豫要排除它。
谢谢你。