Clojure:如何将表单绑定到全局javascript命名空间?

时间:2014-08-02 05:56:43

标签: javascript clojure closures clojurescript

我有一个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命名空间...

帮助? =)

1 个答案:

答案 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'