Будущее со-заявления в Javascript

Я знаю, что использование с -statement не рекомендуется в Javascript и запрещено в ECMAScript 5, но это позволяет создать несколько хороших DSL в Javascript.

Например, CoffeeKup - шаблонный движок и веб-DSL Zappa. Они используют несколько очень странных методов определения области видимости с выражением -Stement для них.

Есть ли будущее с -составлением и такими DSL?

Может ли этот DSL-эффект быть достигнут без дополнения?

4 ответа

Решение

with быть "запрещенным" в ECMAScript 5 - распространенное заблуждение.

Только в строгом режиме ECMAScript 5 - который включен, обратите внимание - with оператор является синтаксической ошибкой. Таким образом, вы, конечно, все еще можете использовать with в полностью ECMAScript 5-совместимых реализациях, если они встречаются в нестрогом (или небрежном, как его называет Крокфорд) коде. Это не будет красиво для производительности (так как простое присутствие with часто убивает различные оптимизации в современных движках) но это будет работать.

Будущие версии ECMAScript, скорее всего, будут основаны на поведении в строгом режиме, хотя, вероятно, также будут включены. Поэтому соответствие строгому режиму, безусловно, хорошая идея, когда речь заходит о проверке сценариев на будущее.

В coffeescript есть хороший трюк, чтобы продолжать использовать модные dsls без использования 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");
     });
   }
 */

Почему бы просто не назначить переменную, указывающую на объект, вместо использования с?

стиль "с":

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';

Чтобы ответить на вопрос Эпели, взгляните на CoffeeMugg, который делает то же, что и CoffeeKup, но используя технику Адриена. Оно использует this. вместо with заявление.

Другие вопросы по тегам