4

重複の可能性:
中括弧なしのJavaScriptのLambda関数構文

Protovisを扱う-中括弧なしで与えられるいくつかの奇妙なデリゲート関数を実装します-誰かが私のためにそれに光を当てることができますか?例:

vis.add(pv.Label)
.data(cols)
.left(function() this.index * w + w / 2)
.top(0)
.textAngle(-Math.PI / 2)
.textBaseline("middle");
4

1 に答える 1

7

一般に、にリンクされている質問@missingnoで説明されているように、これは関数を宣言するための代替構文であり、主にFirefoxでサポートされています。それ以外の:

function() { return "stuff" };

中括弧とreturnステートメントを省略します。

function() "stuff";

関数の終わりは、通常のステートメントが終了する可能性のある場所(セミコロン(;)、コンマ(,)、または閉じ括弧()))で発生します。

Protovisでは、メソッド呼び出しへの引数として渡すために、短い1ステートメントの無名関数を宣言する必要がある場合が多くあります。これは非常に一般的なパターンであるため、そのライブラリには、Firefox以外のブラウザで上記の構文がサポートされていることを確認するための解析ユーティリティが含まれています。Protovisコードを次のようなスクリプトタグで囲む場合:

<script type="text/javascript+protovis">
// ...
</script>

スクリプトはProtovisパーサーによって評価され、特別な構文のサポートが保証されます。

これについての私の2セント:この構文の利点は、それが本当に速いことです(そしてすべての例がそれを使用しています)。Protovisを使用する通常のスクリプトには多くの無名関数が含まれるため、入力を節約でき、見た目もかなり素晴らしいです。Protovisを最初に使い始めたときは、メソッド呼び出しだけでなく、変数宣言でもよく使用していました。

しかし、それはいくつかの本当に重い問題を抱えています:

  • すべてのコードはProtovisパーサーを介して実行されるため、基本的にコードを変更してreturnステートメントを再追加してeval()から、単純な構文エラーをデバッグするのが非常に困難になります。Protovisコードの行を指すこれらすべての「予期しない識別子」エラーeval()が発生しますが、問題(セミコロンの欠落など)が自分のコードのどこで発生しているのかはわかりません。

  • コードをFirefoxの外部で機能させる場合は、すべてのコードを特別なjavascript+protovisスクリプトタグに含める必要があります。これは、外部ファイルがないことを意味します。少しでも複雑なことを始めたら、ほとんどの場合、スクリプトを分離しておく必要があります。

  • 他の「巧妙な」構文と同様に、特に予期しない方法で使用している場合(メソッド呼び出しの外部など)、読みにくくなる可能性があります。はい、それは簡潔ですが、読みやすさで支払うべき明確な代償があります。

とはいえ、ラフスケッチをすばやく作成したい場合は、今でも使用しています。ただし、ほとんどの場合、通常のスクリプトタグと、中括弧で囲まれた標準の関数宣言を使用することをお勧めします。

于 2011-07-26T17:20:29.233 に答える