为什么我的一行等同于将段落附加到节点的函数不给我相同的结果?

Why is my one-line equivalent to a function that appends a paragraph to a node not giving me the same results?

我一直在关注 Scala.js 上的 basic tutorial。为了将 <p> 标记附加到我的 HTML 页面的主体,本教程定义了一个函数 appendPar,它将包含文本的段落附加到另一个节点。

def appendPar(targetNode: dom.Node, text: String): Unit = {
    val parNode = document.createElement("p")
    val textNode = document.createTextNode(text)
    parNode.appendChild(textNode)
    targetNode.appendChild(parNode)
}

此函数在 TutorialApp 的主函数内部调用,以将 <p>Hello world</p> 附加到文档正文。我试过的时候效果很好。

然而,当我尝试在 main 中用一行代码替换上面的代码时,Hello world 被附加到正文中,但没有封装在 <p>...</p>.

document.body appendChild (document.createElement("p") appendChild 
    document.createTextNode("Hello world"))    

据我所知,我的一行相当于 appendPar(document.body, "Hello world")

我真的不推荐这种单行风格——它简洁,但也令人困惑(混合功能和副作用风格),这就是你的错误的来源。

最终,您的内部块将返回新创建的 TextNode,因此这就是 document.body appendChild 的参数。 TextNode 最初p 的子节点这一事实无关紧要——然后它在 document.body.

下重新设置父级

换句话说,事件的顺序是:

  • 创建 p 元素
  • 创建文本节点
  • 将文本节点附加到 p
  • 将文本节点附加到 document.body

最后一步改变了去向...