3

私は最近JSで多くのテンプレートを作成しているので、常に「邪悪な」withステートメントに出くわしました。

変数の前にオブジェクトを付ける必要がないため、テンプレートの操作がはるかに簡単になります。

withステートメントが悪いことと、パフォーマンスが低下する可能性があることを聞いて、私は別の解決策に着手しました。

私の解決策:たくさんのパラメーターを持つ関数

これが私のコードです:

var locals = {
  name : "Matt",
  email : "wahoo@wahoo.com",
  phone : "(555) 555-5555"
};

var keys = [];
var values = [];

for (key in locals) {
  local = locals[key];

  keys.push(key)
  values.push(local);

}

keys = keys.join(',');

var fn = new Function(keys, "**TEMPLATE STUFF**"); // function(name, email, phone) {...}
fn.apply(this, values); // fn("Matt","wahoo@wahoo.com","(555) 555-5555")

注:これらはまったく同じことを実現します。どちらも誰からも抽象化されているので、不愉快に長いパラメータリストは大したことではありません。

どちらが優れているのか疑問に思います。withステートメントを使用するか、パラメーターの数が非常に多くなる可能性のある関数を使用するかです。

誰かがより良い解決策を持っていない限り...?

ありがとう!マットミューラー

4

3 に答える 3

1

私はあなたの解決策が非常に肥大化していると思います。これは完全に重要withですが、非常に単純です(1行のコード自体は、オブジェクトの走査や配列のインスタンス化と比較して、コストがほとんどかかりません)。さらに、あなたのソリューションでは、テンプレート関数を作成するときに(そのパラメーターを定義するために)テンプレートオブジェクトを用意する必要があります。これは、私の意見では、将来的に柔軟性が低下する可能性があります。

MDCをチェックしてください。適切に設計されたテンプレートには、おそらくロジックがほとんどなく、変数の参照が多くなります(そうでない場合は、そうする必要があります)。これはwith、他のルックアップがほとんどないため、このような状況で最適な候補になります。のスコープwith

理論ではなく、いくつかのベンチマークを実行するだけですが、得られる可能性のある追加のパフォーマンスは、マイクロ最適化のように見えます。http://jsperf.com/with-vs-fnは、バージョンのベンチマークの前にすべてのセットアップコードを実行しますがwith、関数の実行中に処理を実行するため、最も遅い反復でもアイデアが得られますが、実際には公平ではありません。それがどれくらい速いか; > 400,000 ops/secが最も遅いです。1秒間に400,000を超えるテンプレートをレンダリングする必要はありません...

于 2011-04-14T08:29:07.220 に答える
1

JSテンプレートエンジンを試しましたか?それらは通常非常に高速であり、レンダリングコードを節約します。

私は少し独創的なpure.jsの作者ですが、他にもたくさんの種類があり、好みに合わせて利用できます。

于 2011-04-14T09:16:40.313 に答える
0

の問題withはパフォーマンスではなく、あいまいで予測できない動作です。

たとえば、JavaScriptの隠し機能を参照してください。

于 2011-04-14T09:14:27.527 に答える