(let [x 42]
(defn foo [n] (+ x n)))
в настоящее время компилируется в
var x__1311 = 42;
cljs.user.foo = (function foo(n){
return (x__1311 + n);
});
Точное число, прикрепленное к x
, может, конечно, варьироваться от компиляции к компиляции, и cljs.user
будет заменено соответствующим именем пространства имен.
Не делается попытка скрыть сгенерированную переменную от несвязанного кода в замыкании JavaScript, поэтому, в принципе, она все еще может быть изменена, если кто-то попытается сделать это. Случайные столкновения крайне маловероятны и просто не произойдут с обычным ClojureScript.
Чтобы обнаружить подобные вещи, вы можете либо вызвать компилятор с {:optimizations :simple :pretty-print true}
среди опций, либо попросить его выдать некоторый JavaScript при REPL (как предусмотрено script/repl
в дереве исходного кода ClojureScript или lein repl
в проект Leiningen с ClojureScript, объявленным как зависимость):
(require '[cljs.compiler :as comp])
(binding [comp/*cljs-ns* 'cljs.user]
(comp/emit
(comp/analyze {:ns {:name 'cljs.user} :context :statement :locals {}}
'(let [x 42] (defn foo [n] (+ x n))))))