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

时间:2017-05-30 17:55:55

标签: scala scala.js

我一直关注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的main函数内调用此函数,以将<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")

1 个答案:

答案 0 :(得分:2)

我并不是真的推荐单行风格 - 它简洁,但也令人困惑(混合功能和副作用风格),以及你的bug即将到来的地方从

最终,你的内部块返回新创建的TextNode,以便将document.body appendChild的参数用作什么。 TextNode 最初 p的孩子这一事实无关紧要 - 然后在document.body下获得了重新定位。

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

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

最后一步改变它的位置......