在clojureScript中有以下多元功能
(defn sum [& xs] (reduce + xs))
可以通过(sum 4 6 9)
调用,也可以使用(apply sum [4 6 9])
调用,结果相同。
如何使用本机JavaScript函数完成此操作,例如:console.log
。
(apply js/console.log [1 2 3])
这会产生以下错误:
#object[TypeError TypeError: 'log' called on an object that does not implement interface Console.]
答案 0 :(得分:4)
有些浏览器总是认为this
是特定对象,您可以在js中使用.bind
进行临时修复。
; you can use .bind on any function
(def d (.bind (.-log js/console) js/console))
(def ms ["aaa" "bbb" "barbarbar"])
(mapv d ms)
What does this statement do? console.log.bind(console)
Why do js functions fail when I assign them to a local variable?
答案 1 :(得分:2)
您的代码可能存在错误。对于JS函数,apply
完全没问题:
cljs.user=> (apply js/Math.sqrt [25])
5
您可以使用此online REPL进行测试,我也在本地项目中测试过它 - 到目前为止没有任何问题。
cljs.user=> (apply js/console.log [1 2 3])
nil
还会按预期在普通JS控制台中打印输出。
答案 2 :(得分:0)
仅当js/a.b
在您的环境中是全局的时,才使用a
。无论哪种方式,我都觉得这样更干净:
(apply (.-log js/console) [1 2 3])
注意:使用成员函数时,请不要忘记第一个参数是this
。