How to define a clojurescript function in the javascript global namespace at compile time?

clojurescript, javascript

Solution

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)

Problem

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.

Original source