这是按我所期望的方式来安慰的:
(.log js/console "hi" "there")
输出为
hi there
但是,这只会给控制台写一个大混乱:
(defn log-it [& args] (.log js/console args))
(log-it "hello" "there")
输出为:
c…s.c…e.IndexedSeq {arr: Array[2], i: 0, meta: null, cljs$lang$protocol_mask$partition0$: 166592766, cljs$lang$protocol_mask$partition1$: 8192}
这也行不通:
(apply .log js/console ["hi" "there"])
有没有办法将向量的元素传递到.log函数中?我是否必须写一个宏才能将矢量加入'(.log js/console)
?
这里的问题是,您正在尝试记录 args
的值(这是一个clojure indexedSeq),而不是作为单个参数传递SEQ中的值。在这种情况下,您需要使用apply
(或将该序列转换为本机数据结构)。
如果您查看apply
的签名,您的另一个示例不起作用。
(apply f args)
它希望第一个参数是您要调用的函数,但是在这里,第一个参数是.log
。
(apply .log js/console ["hi" "there"])
请记住,.log js/console
是在console
上调用log
方法的语法。相反,我们想获得对console.log
函数的引用。
(apply (.-log js/console) args)
我们使用.-log
读取.log
属性,而不是将其称为方法。然后,我们将其与args
序列一起传递。
因此,您可以将原始函数定义为:
(defn log-it
[& args]
(apply (.-log js/console) args))
,或者如果您想变得更聪明。
(def log-it (partial (.-log js/console)))