在原生JavaScript函数上使用apply

时间:2016-08-20 12:09:02

标签: javascript clojurescript

在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.]

3 个答案:

答案 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