2013-08-23 105 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