2013-08-23 96 views
1

project.clj如下:调用自定义JavaScript函数clojurescript

(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; 
} 

如何调用这个js函数从clojurescript文件内?我试图通过以下方式调用此功能:

(js/calculate 4 5 6) 

但是,这并不奏效。谢谢。

回答

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; 
}; 

另一种方法是给Closure编译器一个描述JS代码的外部文件。我不是100%确定如何做到这一点,但有一些pretty good documentation from Google。还有一些大型的外部文件on the project's homepage涵盖了jQuery,Angular和其他常用库。

做的这些方法,你可以调用这个计算一个后:

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

(console/log (jsf/calculate 1 2 3)) 
+0

非常感谢你。这工作很好。 – artella