google-closure编译器高级优化是munging navigator.battery.level导致TypeError

时间:2013-03-17 19:34:45

标签: google-closure-compiler clojurescript navigator

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

 navigator.battery.level

使用简单和空白优化时哪个工作正常。但是当使用高级优化模式时,上面会变成:

navigator.hd.rd

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

我该如何解决这个问题?

修改

修复了以下答案。虽然在ClosureScript中我会做一些讨厌的,嵌套的,但是......所以我想出了这个:

(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)

如果已经有工具,那么有人可以告诉我。

2 个答案:

答案 0 :(得分: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名称。

答案 1 :(得分:2)

使用

 navigator['battery']['level']

这将保留命名。

闭包编译器通常会重命名点符号的变量(如navigator.battery),但保留那些,他知道或使用括号表示法(如navigator ['battery'])。