2016-12-16 26 views
1

这写安慰我期望的方式:在Clojurescript中,如何将集合的元素作为参数传递给变量arity Javascript函数?

(.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)

+0

什么版本的clojurescript。我用clojurescript 1.9运行planck 1.17,你的'log-it'函数似乎工作正常。 –

回答

2

这里的问题是,你正在尝试记录args(它是一个Clojure IndexedSeq)的值,而不是将seq中的值作为单独的参数传递。在这种情况下,您需要使用apply(或将该序列转换为本机数据结构)。

如果你看看the signature for apply,你的其他例子不起作用的原因应该变得清晰。

(apply f args) 

,预计第一个参数是你要调用的功能,但在这里,第一个参数是.log

(apply .log js/console ["hi" "there"]) 

记住.log js/console是调用上consolelog方法的语法。相反,我们想要获得对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))) 
+0

很好的答案。最后的代码片段缺少一个关闭paren – kevincasey

相关问题