Пишу, по большей части, про историю, свою жизнь и немного про программирование.

with в JavaScript и VBScript

Одной из бесполезных конструкций языка JavaScript называют «with». Неспроста, эта конструкция непрозрачна и потенциально может создать непростые проблемы. Небольшой код:

with (MyObject) {
    width = '100px';
    height = '200px';
    display = 'block';
}

Что будет, если свойства с таким именем не найдётся? Код заменит значения переменных width/height/display или же создаст их, если их ещё не было. Что приведёт к проблемам, если мы в связанном коде где-то используем такие имена.

С языком VBScript я знаком с тех пор как программировал, используя технологию ASP. В дальнейшем, я иногда использовал его, чтобы программировать что-то для Internet Explorer, всё-таки некоторые вещи для этого браузера было проще делать в нём.

Этот язык я, в общем-то, не люблю (в отличие от JavaScript), но вот конструкция «With» устроена в нём разумнее:

With MyObject
    .width = "100px"
    .height = "200px"
    .display = "block"
End With

Заметили точки впереди? Они говорят о том, что используются не просто переменные, а свойства (ну или методы) объекта, указанного в «With». Вот так просто решается куча проблем.

15 комментариев
Victor Grinchik (wiktar.com) 2010

Как я понимаю, преимущество конструкции with перед многократным дублированием document.getElementById(’popup’).style в том, что не придётся несколько раз вызывать getElementById?

Евгений Степанищев (bolknote.ru) 2010

Комментарий для wiktar.com:

Вообще-то, можно просто положить ссылку на «document.getElementById(’popup’).style» в переменную, было бы примерно то же самое. Это такой синтаксический сахар, показывающий «а вот тут мы работает с объектом MyObject».

me.yahoo.com/kuchin 2010

В jQuery это очень удобно сделано, внутри функции работаешь с обьектом (или набором обьектов) как с this. Единственный недостаток — если такого обьекта нет, то нет и уведомления, просто функция обработки не запустится.

me.yahoo.com/kuchin 2010

Кстати, я ввел имя/адрес блога «kuchin.net», а меня показывает как me.yahoo.com/kuchin — это «delegate» адрес.

Евгений Степанищев (bolknote.ru) 2010

Комментарий для me.yahoo.com/kuchin:

Так надо и указывать «delegate», а не «local»

kuchin (kuchin.net) 2010

Yahoo не поддерживает OpenID 1.х, только 2.0, а там не выставить delegate. Поменял сервер на Yandex.

vkv (vkv.livejournal.com) 2010

эээ, UnhandledException
message: Undefined variable: MyObject
это ж не пехапе всетаки какой

vkv (vkv.livejournal.com) 2010

а, понял, если объект есть, а свойства с таким именем нет.
коряво, да.

Евгений Степанищев (bolknote.ru) 2010

Комментарий для vkv.livejournal.com:

Да это я сам напутал. Неожиданно оказалось, что надо на встречу и сырой текст пришлось запостить как есть.

boltai-shaltai 2010

Здесь акцент именно на особенности реализации with в VBScript?
В нём, в уродливом VBScript, и с «коллекциями» совсем другой коленкор. Я его позабыл уже, а порой ведь хотелось делать inline-вставки в JScript.

Или тема вообще о непригодности with ни для чего?

Евгений Степанищев (bolknote.ru) 2010

Комментарий для boltai-shaltai:

Тут написано о том, что в VBScript конструкция «with» сделана лучше. Кажется немного текста же?

boltai-shaltai 2010

Странный тон, Евгений (

Ну глупый вопрос, да. Вероятно, мне хотелось услышать несколько слов «о вредности with» безотносительно бейсика.

Евгений Степанищев (bolknote.ru) 2010

Комментарий для boltai-shaltai:

Странный тон, Евгений (

Пардон, не хотел обидеть.

Вероятно, мне хотелось услышать несколько слов «о вредности with» безотносительно бейсика.

Я как раз написал о недостатках with и пути их решения.

Евгений Степанищев (bolknote.ru) 2010

Комментарий для jankkhvej.blogspot.com:

Про let? Да, я знаком с этой конструкцией в JS.