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

时间:2013-06-17 09:33:55

标签: clojurescript

我正在尝试一些HTML5画布绘图,我遇到了高级编译模式的问题。我想用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标识符。

我的问题是:

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

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

1 个答案:

答案 0 :(得分:5)

允许闭包编译器重命名直接访问的属性,这些属性未在externs或exports中指定。

请参阅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属性。