2

HTML5 Canvas の線ダッシュを設定するために、いくつかの Clojurescript コードがあります。これはクロスブラウザーの問題の典型的なケースであるため、最初に 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 (空白) で動作します。次の理由により、高度なコンパイルは Google Chrome では機能しませんTypeError

Google Chrome デバッグ ウィンドウの出力

オブジェクトの一部であるため、これはちょっと奇妙.setLineDashです(そして空白モードで動作します)。My "feeling": 今、私が奇妙に感じるmのは call のパラメーターです。これがnullこの振る舞いの理由なのだろうか?ある意味で、私はこれについて判断するには、Javascript の内部構造にあまり自信がありません。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call によると、 の引数のm場所にあります。thisfun.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 に答える