8

withステートメントの使用はJavascriptでは推奨されておらず、ECMAScript 5 では禁止されていますが、Javascript でいくつかの素敵な DSL を作成することができます。

たとえば、CoffeeKup テンプレートエンジンやZappa Web DSL などです。それらは、 with ステートメントでいくつかの非常に奇妙なスコープ方法を使用して、DSL ような感覚を実現しています。

withステートメントとこれらの種類の DSL に未来はありますか?

この DSL 効果はwithステートメントなしで達成できますか?

4

4 に答える 4

10

coffeescript には、 を使用せずに派手な DSL を使用し続けるための素晴らしいトリックがありwithます。

 using = (ob, fn) -> fn.apply(ob)

 html = 
   head : (obj) -> # implementation
   body : (fn)  -> # implementation
   div  : (str) -> # implementation

 using html, ->
   @head
     title: "My title"
   @body =>
     @div "foo bar"
     @div "qux moo"

 /*
   in pure javascript you'd be using
   with(html){
     head({title:"My title"});
     body(function(){
       div("foo bar");
       div("qux moo");
     });
   }
 */
于 2011-03-21T06:44:18.210 に答える
9

withECMAScript 5 で「禁止」されていることはよくある誤解です。

ECMAScript 5 の strict モード ( opt-inであることに注意してください) でのみ、withステートメントは構文エラーになります。withそのため、完全に ECMAScript 5 に準拠した実装でも、それが非厳密な (または Crockford の言うところのずさんな) コードで発生する限り、確実に引き続き使用できます。パフォーマンスは良くありませんが (with最近のエンジンでは が存在するだけでさまざまな最適化が無効になることが多いため)、機能します。

ECMAScript の将来のバージョンは、厳密モードの動作に基づく可能性が非常に高くなりますが、オプトインも行われる可能性があります。したがって、厳密モードに準拠することは、スクリプトの将来の証明に関しては確かに良い考えです。

于 2011-03-21T05:28:14.460 に答える
2

with を使用する代わりに、オブジェクトを指すように単に var を割り当ててみませんか?

'with' スタイル:

with(a_long_object_name_that_is_bloated) {
  propertyA = 'moo';
  propertyB = 'cow';
}

'var' スタイル:

var o = a_long_object_name_that_is_bloated;
o.propertyA = 'moo';
o.propertyB = 'cow';
于 2011-06-19T21:23:48.067 に答える