我正在尝试一些 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/

    10-09 20:46