在本机 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
。
在 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
。