如何在编译时在javascript全局命名空间中定义clojurescript函数?

时间:2013-03-06 22:07:04

标签: javascript clojurescript

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

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

2 个答案:

答案 0 :(得分:8)

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

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

然后,您应该可以从窗口(浏览器中的全局JavaScript命名空间)调用foo

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

(set! js/foo foo)

答案 1 :(得分:2)

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

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

调用该函数按预期工作:

(js/some_fn)