ClojureScript和闭包:如何保护属性不被闭包重命名

wir*_*bel 4 clojurescript

我正在尝试一些HTML5画布绘图,我遇到了高级编译模式的问题.我想用mozDashMozilla浏览器的属性来举例说明(虽然这个问题在属性优化功能上非常通用)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变体保留了标识符.

因此,我的问题是:

  • 这是这些符号的预期差异吗?
  • 为什么行为不同([1]和[2]有效)(.-fillStyle canvas)

我有点怀疑默认情况下标准HTML属性受到保护,mozDash而不支持非标准属性(如).

Joo*_*aat 5

允许闭包编译器重命名直接访问的属性,这些属性未在外部或导出中指定.

请参阅https://developers.google.com/closure/compiler/docs/api-tutorial3#propnames

具体而言,(aset x "y" z)转换x["y"] = z为免除最小化,(set! (.-y x) z)转换为x.y = z并且可以最小化,除非将xy指定为extern或导出.

我假设你在用于Canvas的外部文件中没有指定mozDash属性.