ClojureScript 函数总是被执行

ClojureScript function is always executed

我正在学习 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 because the "root-app" div exists in that page, but in http://localhost:3000/blog 中一切正常,我收到错误消息:

因为那个页面没有div。这一切都很奇怪,因为看起来 ClojureScript 实际上发现:

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

实际上是 false en console.log 没有被打印出来。

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

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

不 运行 但 mount-components 函数可以。我想我不理解 ClojureScript 工作方式中的 "sequence"。

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

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