Будущее со-заявления в 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
заявление.