ClojureScript函数始终执行

时间:2017-10-13 00:58:17

标签: clojure clojurescript luminus

我正在学习ClojureScript,我有两个函数只是改变了“root-app”div中的内容:

(ns blog.core)

 (defn mount-components []
   (let [content (js/document.getElementById "root-app")]
     (while (.hasChildNodes content)
       (.removeChild content (.-lastChild content)))
     (.appendChild content (js/document.createTextNode "Wilkommen zu mein 
     ekelhaft blog!!"))))

 (defn init! []
   (def current_url js/window.location.href)
   (if (clojure.string/includes? current_url "about")
     (.log js/console (str "Whatever URL ->>>" js/window.location.href))
     (mount-components)))

一切正常http://localhost:3000/about,因为该页面中存在“root-app”div,但在http://localhost:3000/blog中,我收到错误消息:

enter image description here

因为该页面中没有这样的div。所有这一切都很奇怪,因为它看起来像ClojureScript实际上发现:

 (if (clojure.string/includes? current_url "about")

实际上是假的,不打印console.log。

我的问题是:为什么函数 mount-components 会运行并发送错误消息,即使条件 if 为false?奇怪的是console.log:

 (.log js/console (str "Whatever URL ->>>" js/window.location.href))   

不会运行,但 mount-components 功能会运行。我想我不会像ClojureScript那样理解“序列”。

2 个答案:

答案 0 :(得分:3)

我不确定,但根据您的描述,我认为您所考虑的逻辑和您实际测试的逻辑并不相同。你的if语句会查找' about'在URL中。如果它在那里,那么它打印控制台日志,即它将在那里http://localhost:300/about。如果不存在,它将运行mount-components函数,该函数查找您说不包含在页面中的div ID,因此您会收到错误。 mount-components是一个ELSE语句,因此在测试为false时执行。

答案 1 :(得分:3)

if表单的作用类似于(if cond true-branch false-branch),因此您的(mount-component)会被执行,因为它位于假分支中。查看when,它只有一个真正的分支。