html5-canvas - Chrome 的非法调用错误和关闭

标签 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 是对象的一部分(并且在空白模式下工作)。我的“感觉”:现在让我感觉奇怪的是call的参数m。它是 null 我想知道这是否是这种行为的原因?在某种程度上,我对这里的 Javascript 内部机制不太有信心来判断这一点。根据https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call m 位于 fun.callthis 参数的位置。

最佳答案

我现在遵循使用 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/

相关文章:

javascript - Fabric js 从来自另一个 url 的数据 uri 加载图像

javascript - 锐化 HTML5 Canvas 中的绘图

javascript - 在 html5 Canvas 上拖动和调整图像大小

循环内的 JavaScript 闭包——简单实用的示例

clojure - 试剂中的交互式列表

java - 文本编辑器的 Clojure zipper 结构(带有映射和数组)

javascript - 响应式 Canvas vuejs

swift - 不需要闭包返回值时如何调用函数

javascript - [[范围]] 和执行上下文

vim - 如何将 fireplace.vim 连接到浏览器 repl