3

ClojureScript を使用してバッテリー レベルを取得しています。

 navigator.battery.level

シンプルで空白の最適化を使用すると、これはうまく機能します。ただし、高度な最適化モードを使用すると、上記は次のようになります。

navigator.hd.rd

navigator.hd が定義されていないため、TypeError が発生します。

どうすればこれを修正できますか?

編集:

以下の回答のおかげで修正されました。ClosureScriptでは、厄介なネストされたagesを実行する必要があります...だから私はこれを思いつきました:

(defn jget [jobject & props]    
(loop [obj jobject 
       p (map name props)]
    (if (not (empty? p))            
        (let [prop (aget obj (first p))]
            (recur prop (rest p)))
    obj)))

次に、次のように呼び出しました。

(jget js/navigator :battery :level)

このためのツールが既に存在する場合は、誰かが私に知らせてください。

4

2 に答える 2

4

もう 1 つの解決策はexterns、名前を保持したいすべてのオブジェクトとメソッドへの参照を含む JavaScript ファイルであるファイルを作成することです。この場合、JS ファイルは次のようになります。

//resources/externs/navigator.js
navigator = {}
navigator.battery = {}
navigator.battery.level = function(){};

そして、ClojureScript コンパイラ オプションで次のように参照します。

:externs ["resources/externs/navigator.js"]

Sirko が提案した解決策と同様に、これにより、高度なモードのコンパイルでnavigator.battery.level名前が改ざんされるのを防ぐことができます。

于 2013-03-18T04:52:13.193 に答える
2

使用する

 navigator['battery']['level']

これにより、命名が保持されます。

クロージャ コンパイラは、ほとんどの場合、ドット表記 ( などnavigator.battery) の変数の名前を変更しますが、ブラケット表記 (navigator['battery'] など) を知っているか使用するものは保持します。

于 2013-03-17T19:41:53.003 に答える