3

我正在使用 ClojureScript 来检索电池电量:

 navigator.battery.level

使用简单和空白优化时效果很好。但是当使用高级优化模式时,上面会变成:

navigator.hd.rd

并导致 TypeError 因为 navigator.hd 未定义。

我怎样才能解决这个问题?

编辑:

由于下面的答案而修复。虽然在 ClosureScript 中我不得不做一些讨厌的、嵌套的、agets ......所以我想出了这个:

(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

另一种解决方案是编写一个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 回答