我正在尝试一些 HTML5 Canvas 绘图,但遇到了高级编译模式的问题。我想用 Mozilla 浏览器的 mozDash
属性来举例说明这一点(尽管这个问题在属性优化功能上非常通用) https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D#Gecko-specific_attributes
javascript canvas.mozDash = ...
代码在 Clojurescript 中可以表示为 [1] (set! (.-mozDash canvas) ...)
或 [2] (aset canvas "mozDash" ...)
。
我之前使用过 [1] 并且它在大多数情况下都有效,但是使用 mozDash
属性,mozDash
标识符在高级编译结果中消失了。因此我尝试了 [2] 并且似乎使用 mozDash
变体保留了 aset
标识符。
因此,我的问题是:
(.-fillStyle canvas)
的行为不同([1] 和 [2] 工作)? 我有点怀疑标准 HTML 属性默认受到保护,而不支持非标准属性(如
mozDash
)。 最佳答案
闭包编译器可以重命名未在 extern 或导出中指定的直接访问的属性。
见 https://developers.google.com/closure/compiler/docs/api-tutorial3#propnames
具体来说, (aset x "y" z)
转换为 x["y"] = z
,免于最小化,而 (set! (.-y x) z)
转换为 x.y = z
并且可以最小化,除非 x.y 被指定为 extern 或导出。
我假设您用于 Canvas 的 externs 文件中未指定 mozDash 属性。
关于ClojureScript 和闭包 : how to protect attributes from being renamed by closure,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17144429/