1

我的project.clj如下:

(defproject cljsbuild-example-simple "0.3.2"
  :description "A simple example of how to use lein-cljsbuild"
  :source-paths ["src-clj"]
  :dependencies [[org.clojure/clojure "1.5.1"]
                 [compojure "1.0.4"]
                 [hiccup "1.0.0"]]
  :plugins [[lein-cljsbuild "0.3.2"]
            [lein-ring "0.7.0"]]
  :cljsbuild {
    :builds [{:source-paths ["src-cljs"]
              :compiler {:output-to "resources/public/js/main.js"
                         :libs ["src-js/jsfuncs.js"]
                         :optimizations :whitespace
                         :pretty-print true}}]}
  :ring {:handler example.routes/app})

jsfuncs.js包含以下代码:

function calculate(a,b,c) {
    d = (a+b) * c;
    return d;
}

如何从 clojurescript 文件中调用此 js 函数?我试图通过以下方式调用此函数:

(js/calculate 4 5 6)

但这没有用。谢谢。

4

1 回答 1

4

主要问题是 Google Closure Compiler 需要读取 JavaScript 并能够理解它。普通的 JS 代码缺少编译器所必需的一些提示(JSDoc 标签)和命名空间。

JSDoc 标记是一种可选的(它们帮助编译器捕获额外的错误并更好地优化代码),但需要添加命名空间部分。所以这将是:

goog.provide('jsfuncs');

/**
 * @param {number} a
 * @param {number} b
 * @param {number} c
 * @return {number}
 */
jsfuncs.calculate = function(a, b, c) {
  d = (a+b) * c;
  return d;
};

另一种方法是给闭包编译器一个描述 JS 代码的外部文件。我不是 100% 确定如何做到这一点,但Google 提供了一些非常好的文档项目主页上还有一些大型外部文件,涵盖 jQuery、Angular 和其他常用库。

在执行这些方法之一后,您可以使用以下方法调用计算:

(ns some.namespace
   (:require [jsfuncs :as jsf]))

(console/log (jsf/calculate 1 2 3))
于 2013-08-24T04:58:16.773 回答