非法调用Chrome和Closure时出错

时间:2013-06-19 07:23:47

标签: html5-canvas closures clojurescript

我有一些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中无效

Google Chrome Debug Window output

这有点奇怪,因为.setLineDash是对象的一部分(并且在空白模式下工作)。我的“感觉”:现在对我来说感觉很奇怪的是调用的m参数。它是null,我想知道这是否是这种行为的原因?在某种程度上,我对这里的Javascript内部结构并不太自信。根据{{​​3}} m代替this的{​​{1}}参数。

1 个答案:

答案 0 :(得分:3)

我现在遵循使用an extern.js file并在其中声明setLineDash的方法。

var CanvasRenderingContext2D = {};
CanvasRenderingContext2D.setLineDash = function() {};

然后我用了

(when (..  c -setLineDash)
  (.. c (setLineDash dash)))

编译(高级模式)到

y(a.setLineDash)&&a.setLineDash(c);

这有效(没有.call古怪)。