Будущее с-утверждением в Javascript - PullRequest
7 голосов
/ 21 марта 2011

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

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

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

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

Ответы [ 4 ]

10 голосов
/ 21 марта 2011

В 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");
     });
   }
 */
9 голосов
/ 21 марта 2011

with будучи «запрещенным» в ECMAScript 5, является распространенным заблуждением .

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

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

2 голосов
/ 20 июня 2011

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

'with' style:

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

'var' style:

var o = a_long_object_name_that_is_bloated;
o.propertyA = 'moo';
o.propertyB = 'cow';
1 голос
/ 30 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...