我正在学习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中,我收到错误消息:
因为该页面中没有这样的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那样理解“序列”。
答案 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,它只有一个真正的分支。