7

我正在寻找一种在编译时在 Javascript 全局命名空间中定义 Clojurescript 函数的方法。我所说的编译时的意思是我希望 Clojurescript 编译器输出这个:function some_fn() { }. 我知道这不是惯用的,一切都应该驻留在名称空间中,但我所处的环境迫使我这样做。因此,理想情况下,类似(defn ^:global some-fn [])的工作方式与工作方式类似,:export但会忽略名称空间。

我知道使用 goog.global 定义全局函数的运行时方法,例如 (set! goog.global.someFunction some-clojure-fn),但这在我的环境中不起作用。

4

2 回答 2

8

也许您可以在命名空间中定义它,然后在窗口(或 GLOBAL 或这取决于您的环境)对象中公开它:

(defn foo [x] (* 2 x))
(aset js/window "foo" myns/foo)  ;; where myns is where foo is defined

然后,您应该能够foo从窗口(这是浏览器中的全局 JavaScript 命名空间)调用。

更新:正如@TerjeNorderhaug 所建议的,您可以在全局命名空间中设置一个变量,如下所示:

(set! js/foo foo)
于 2013-03-06T22:51:58.667 回答
2

将 javascript var 设置为匿名 Clojurescript 函数将在 Javascript 全局命名空间中定义编译后的函数:

(set! js/some_fn (fn []))

调用函数按预期工作:

(js/some_fn)

于 2016-03-01T19:00:23.157 回答