在本机 JavaScript 函数上使用应用

Use apply on native JavaScript functions

在 clojureScript 中,下面的 multi-arity 函数

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

有些浏览器总是假设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)

相关问题

您的代码中可能有错误。 apply 对于 JS 函数开箱即用:

cljs.user=> (apply js/Math.sqrt [25])
5

你可以用这个 online REPL 来测试它,我也在我的本地项目中测试过 -- 目前没有问题。

cljs.user=> (apply js/console.log [1 2 3])
nil

也按预期在普通 JS 控制台中打印输出。

仅当 a 在您的环境中是全局的时,使用 js/a.b 才有效。无论哪种方式,我都觉得这样更干净:

(apply (.-log js/console) [1 2 3])

注意:对于成员函数,不要忘记第一个参数是this