我有一些 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. 和空白)和 Google Chrome(空白)。由于 TypeError
,高级编译在 Google Chrome 中不起作用:
这有点奇怪,因为 .setLineDash
是对象的一部分(并且在空白模式下工作)。我的“感觉”:现在让我感觉奇怪的是call的参数m
。它是 null
我想知道这是否是这种行为的原因?在某种程度上,我对这里的 Javascript 内部机制不太有信心来判断这一点。根据https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call m
位于 fun.call
的 this
参数的位置。
最佳答案
我现在遵循使用 an extern.js file 的方法并在其中声明了 setLineDash
。
var CanvasRenderingContext2D = {};
CanvasRenderingContext2D.setLineDash = function() {};
然后我用了
(when (.. c -setLineDash)
(.. c (setLineDash dash)))
编译(高级模式)为
y(a.setLineDash)&&a.setLineDash(c);
这有效(没有 .call
怪异)。
关于html5-canvas - Chrome 的非法调用错误和关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17185198/