我有一些 Clojurescript 代码来设置 HTML5 Canvas 划线。由于这是跨浏览器问题的典型情况,我想首先检查 Canvas Context 对象是否具有属性setLineDash
,然后调用它(以避免属性错误等)。我选择了aget
语法,因为它可以防止名称修改。
(when (aget c "setLineDash")
((aget c "setLineDash") c dash))
相关行由 Google Closure 以“空白”模式编译:
if(cljs.core.truth_(c["setLineDash"])) {
c["setLineDash"].call(null, c, dash)
}
然后在高级优化模式下:
y(a.setLineDash) && a.setLineDash.call(m, a, c);
所以我觉得编译还可以。a
似乎是 c 的名字,y
可能是cljs.core.truth_
. 该代码适用于 Mozilla Firefox (adv. 和 whitespace) 和 Google Chrome (whitespace)。由于以下原因,高级编译在 Google Chrome 中不起作用TypeError
:
这有点奇怪,因为.setLineDash
它是对象的一部分(并且在空白模式下工作)。我的“感觉”:现在让我觉得奇怪的是m
调用的参数。是的null
,我想知道这是否是这种行为的原因?在某种程度上,我对这里的 Javascript 内部结构不太有信心来判断这一点。根据https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call m
代替. this
_fun.call