我正在使用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)
如果已经有工具,那么有人可以告诉我。
答案 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'])。