我有一个clojure项目,我正在生成一些JavaScript。请注意,这是一个 clojure 项目,而不是clojurescript项目。
现在我的project.clj有(除其他外):
:dependencies [[org/clojurescript "0.0-1806"]]
在我的clojure中,我正在使用:
(ns blah
(:require [cljs.closure :as cljs])
(defn trivial-example []
(cljs/build '(defn foo [] "bar")
{:optimizations :advanced :pretty-print true}))
这很好用。当我调用(blah / trivial-example)时,我得到一个不错的javascript输出:
"cljs.b.a = function() {\n return\"bar\"\n};\n"
问题:如何将函数foo
绑定为全局变量(如window.foo或其他)?我不希望它是cljs.b.a
,我希望它可以通过JavaScript foo()
(或我通过代码选择的任何其他名称)访问。
注意:我按照别处的建议尝试了这个:
(aset js/window "foo" foo)
但是我得到了一个错误:
CompilerException java.lang.RuntimeException: No such namespace: js, compiling:(NO_SOURCE_PATH:1:1)
我从中获取它需要访问某种js命名空间,cljs.closure可以将其理解为JavaScript命名空间...
帮助? =)
答案 0 :(得分:0)
添加^:导出,了解详情http://lukevanderhart.com/2011/09/30/using-javascript-and-clojurescript.html
(ns cmpl.core
(:require [cljs.closure :as cljs]))
(defn trivial-example []
(cljs/build '[(ns cmpl.core)
(defn ^{:export foo} foo [] "bar")]
{:optimizations :advanced
:pretty-print true}))
输出:
"undefined" !== typeof Math.imul && (Math.imul.a ? Math.imul.a(4294967295, 5) : Math.imul.call(null, 4294967295, 5));
function a() {
return "bar";
}
var b = ["foo"], c = this;
b[0] in c || !c.execScript || c.execScript("var " + b[0]);
for (var d;b.length && (d = b.shift());) {
b.length || void 0 === a ? c = c[d] ? c[d] : c[d] = {} : c[d] = a;
}
;
在node.js中测试(复制和粘贴代码并调用foo):
→ node
> "undefined" !== typeof Math.imul && (Math.imul.a ? Math.imul.a(4294967295, 5) : Math.imul.call(null, 4294967295, 5));
false
> function a() {
... return "bar";
... }
undefined
> var b = ["foo"], c = this;
undefined
> b[0] in c || !c.execScript || c.execScript("var " + b[0]);
true
> for (var d;b.length && (d = b.shift());) {
... b.length || void 0 === a ? c = c[d] ? c[d] : c[d] = {} : c[d] = a;
... }
[Function: a]
> ;
undefined
> foo
[Function: a]
> foo()
'bar'