ClojureScript中的js/console.log

Chp*_*t.X 10 debugging clojurescript

我想用ClojureScript实现一个函数来简化js/console.log如下:

  (defn log [& args]
      (apply js/console.log args))
Run Code Online (Sandbox Code Playgroud)

叫它:(log "foo" "bar") 抛出: TypeError: Illegal invocation

但这有效: (js/console.log "foo" "bar")

问题是什么 ?

Joa*_*uin 12

js/something是用于访问js对象,但在此之后你不应该嵌套点,因为它不是与clojure兼容的语法,它将被删除.在旧版本的编译器(2138)中,您的代码可以正常工作,但有可能在较新版本的编译器中不推荐使用它.你使用的是哪个版本?

正确的方法是使用这样简单的js互操作:[警告:请参阅下面的评论,来自David Nolen,ClojureScript首席开发人员]

(defn log [& args] (apply (.-log js/console) args))
Run Code Online (Sandbox Code Playgroud)

甚至更短,因为console.log已经是variadic(只是做一个别名):

(def log (.-log js/console))
Run Code Online (Sandbox Code Playgroud)

  • 编写`js/console.log`是完全没问题,这是支持的,永远不会改变.无论如何,这往往会出现在互操作情况下,所以它无论如何都是不可移植的. (9认同)

joh*_*ers 6

如果您首先将它放在文件的顶部,也可以使用println :( enable-console-print!).

  • 它们不是完全一样的东西。`println` 使用 clojure 的字符串序列化行为,而 `console.log` 在大多数浏览器中会将对象呈现为可导航树。 (2认同)

bbs*_*bbs 6

并且pprint已被移植:

:require [cljs.pprint :refer [pprint]]
Run Code Online (Sandbox Code Playgroud)

  • 来自:http://swannodette.github.io/2015/07/29/clojurescript-17/ “强烈赞扬 Shaun LeBron 和 Jonathan Boston 将 clojure.pprint 移植到 ClojureScript 的工作,以便我们可以看到打印精美的 AST ”。 (2认同)