我有两个代码片段,我认为这两个代码片段都会产生警报。但是,第一个结果为none,而第二个执行警报。
(map #(.alert js/window %) ["hey1" "hey2"])
这个轻微修改按预期打印(零nil),以及修复警报问题。问题是为什么?
(print (map #(.alert js/window %) ["hey1" "hey2"]))
另一个奇怪的观察是,第一个代码段是从浏览器重新编写的,但在键入代码时则不行。
地图功能副作用是免费的,但打印不是吗?也许我不知道一些核心代码优化?
解决方法和答案都很受欢迎。如果您需要更多信息,请在评论中告诉我。
[org.clojure / clojurescript“1.8.51”]
BOOT_CLOJURE_VERSION = 1.7.0
BOOT_VERSION = 2.5.5
java版“1.8.0_101”
描述:Ubuntu 14.04.4 LTS
答案 0 :(得分:5)
您不希望使用map
进行类似警报的副作用操作。您看到的问题是map
懒惰的结果,因此在您使用结果序列的元素之前,它实际上不会执行任务。如果你真的想做副作用的事情,doseq
可能是更好的选择,特别是如果你不需要一系列结果:
(doseq [msg ["hey1" "hey2"]]
(.alert js/window msg))
或者您可以使用doall
来强制评估整个序列:
(doall (map #(.alert js/window %) ["hey1" "hey2"]))