Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 保存文档片段引用的函数属性:何时使用cloneNode?_Javascript_Documentfragment - Fatal编程技术网

Javascript 保存文档片段引用的函数属性:何时使用cloneNode?

Javascript 保存文档片段引用的函数属性:何时使用cloneNode?,javascript,documentfragment,Javascript,Documentfragment,我很难理解对象的数据分配何时是引用,以及何时创建对象的副本。我以为我明白了,但下面的例子不符合我对它的简单理解 事件处理程序启动一系列步骤,如下所示。 Promise.allSettled([collect\u write,get\u build])。然后(test) 承诺collect\u write和get\u build执行不相关的功能。第一个从DOM收集一些数据并将其写入数据库。第二个从数据库中检索数据并构建文档片段。如果两者都满足,则DOM中的节点将替换为片段 这里要显示的代码太多了,

我很难理解对象的数据分配何时是引用,以及何时创建对象的副本。我以为我明白了,但下面的例子不符合我对它的简单理解

事件处理程序启动一系列步骤,如下所示。
Promise.allSettled([collect\u write,get\u build])。然后(test)

承诺
collect\u write
get\u build
执行不相关的功能。第一个从DOM收集一些数据并将其写入数据库。第二个从数据库中检索数据并构建文档片段。如果两者都满足,则DOM中的节点将替换为片段

这里要显示的代码太多了,但是从数据库成功获取数据后,调用一个单独的函数来构建文档片段,并将其结果作为resolve对象的属性返回。效果很好;然后,我想尝试在
gather\u write
被拒绝和
get\u 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
必须在promise
get\u build
可以解析之前完成,之后才能对
promise.allsetted
进行评估;而且,如果这两个承诺都实现了,则可以调用用存储在
build.html
中的新构建片段替换DOM节点的函数。我认为
build.html
将是对节点对象
f
的引用,并且由于
f
finally
块中设置为null,这将在上述所有操作完成之前发生,当使用
build.html
的代码最终运行时,它将指向null而不是片段。因此,赋值语句应该是
build.html=f.cloneNode(true)

但是,无论是否使用
f.cloneNode
,该过程都可以正常工作。请你解释一下原因好吗?我不希望浏览器采取步骤克隆不必要的片段,但在不理解为什么不克隆就可以工作的情况下,犹豫是否将其排除


谢谢。

您可以将每个变量名视为指向内存位置的指针。将变量名设置为
null
不会改变变量所包含的内容;它所做的只是将变量名指向的对象从先前的引用(此处为文档片段)更改为新引用(null)。所以,当你这么做的时候

f = document.createFragment();
build.html = f;
然后,无论将来是否/如何重新分配
f
变量名,
build.html
都不会改变,因为它继续指向文档片段。改变
build.html
的唯一方法是如果片段发生了变异(例如在重新分配之前分配给
f
属性,或者调用片段的一个方法)

下面是这种行为的另一个最小示例:

函数foo(){
设f={prop:'val'};
foo.f=f;
f=零;
}
foo();

console.log(foo.f)您可以将每个变量名视为指向内存位置的指针。将变量名设置为
null
不会改变变量所包含的内容;它所做的只是将变量名指向的对象从先前的引用(此处为文档片段)更改为新引用(null)。所以,当你这么做的时候

f = document.createFragment();
build.html = f;
然后,无论将来是否/如何重新分配
f
变量名,
build.html
都不会改变,因为它继续指向文档片段。改变
build.html
的唯一方法是如果片段发生了变异(例如在重新分配之前分配给
f
属性,或者调用片段的一个方法)

下面是这种行为的另一个最小示例:

函数foo(){
设f={prop:'val'};
foo.f=f;
f=零;
}
foo();

console.log(foo.f)谢谢。我真傻。我的代码所做的就是引用一个引用,也就是说,我可以在一开始就将
build.html
设置为documentFragment,而从不声明
f
。我担心由于不处理
f
而导致内存泄漏,但我需要确保在将
build.html
附加到DOM或故障代码完成后断开与它的连接。再次感谢,“我的代码所做的就是引用一个引用”。不,它正在对同一对象进行另一次引用。:-)@罗布:谢谢你指出这一点。我在编码方面的经验一直是我用来解决问题的工作工具,但我对真正了解您所做工作所需的一些基础知识缺乏了解。谢谢。我真傻。我的代码所做的就是引用一个引用,也就是说,我可以在一开始就将
build.html
设置为documentFragment,而从不声明
f
。我担心由于不处理
f
而导致内存泄漏,但我需要确保在将
build.html
附加到DOM或故障代码完成后断开与它的连接。再次感谢,“我的代码所做的就是引用一个引用”。不,它正在对同一对象进行另一次引用。:-)@罗布:谢谢你指出这一点。我在编码方面的经验一直是我用来解决问题的工作工具,但我对真正了解你在做什么所需要的一些基础知识缺乏了解。