我正在寻找一种在编译时在Javascript全局命名空间中定义Clojurescript函数的方法。编译时我的意思是我希望Clojurescript编译器输出:function some_fn() { }
。我知道这不是惯用的,一切都应该存在于命名空间中,但是我强迫我这样做的环境。因此,理想情况下(defn ^:global some-fn [])
类似于:export
的工作方式,但忽略命名空间。
我知道使用goog.global定义全局函数的运行时方法,例如
(set! goog.global.someFunction some-clojure-fn)
但这在我的环境中无效。
答案 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)