2

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

Google Chrome 调试窗口输出

这有点奇怪,因为.setLineDash它是对象的一部分(并且在空白模式下工作)。我的“感觉”:现在让我觉得奇怪的是m调用的参数。是的null,我想知道这是否是这种行为的原因?在某种程度上,我对这里的 Javascript 内部结构不太有信心来判断这一点。根据https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call m代替. this_fun.call

4

1 回答 1

3

我现在遵循使用extern.js 文件setLineDash在其中声明的方法。

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

然后我用

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

编译(高级模式)为

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

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

于 2013-06-19T07:53:14.143 回答