I'm looking for a way to define Clojurescript functions in the Javascript global namespace at compile time. What I mean by compile-time is that I want the Clojurescript compiler to output this: function some_fn() { }
. I know that this is not idiomatic and everything should reside in a namespace but the environment that I'm in forces me to do this. So, ideally something like (defn ^:global some-fn [])
that would work similar to how :export
works but ignores the namespace.
I'm aware of the runtime method for defining global functions using goog.global, e.g
(set! goog.global.someFunction some-clojure-fn)
but this doesn't work in my environment.
Perhaps you could define it in a namespace and then expose it in the window (or GLOBAL or this depending on your environment) object:
(defn foo [x] (* 2 x))
(aset js/window "foo" myns/foo) ;; where myns is where foo is defined
You should then be able to call foo
from the window (which is the global JavaScript namespace in the browser).
Update: As suggested by @TerjeNorderhaug, you can set a variable in the global namespace like this:
(set! js/foo foo)
Setting a javascript var to an anonymous Clojurescript function will define the compiled function in the Javascript global namespace:
(set! js/some_fn (fn []))
Calling the function works as expected:
(js/some_fn)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With