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». Вот так просто решается куча проблем.
Как я понимаю, преимущество конструкции with перед многократным дублированием document.getElementById(’popup’).style в том, что не придётся несколько раз вызывать getElementById?
Комментарий для wiktar.com:
Вообще-то, можно просто положить ссылку на «document.getElementById(’popup’).style» в переменную, было бы примерно то же самое. Это такой синтаксический сахар, показывающий «а вот тут мы работает с объектом MyObject».
В jQuery это очень удобно сделано, внутри функции работаешь с обьектом (или набором обьектов) как с this. Единственный недостаток — если такого обьекта нет, то нет и уведомления, просто функция обработки не запустится.
Кстати, я ввел имя/адрес блога «kuchin.net», а меня показывает как me.yahoo.com/kuchin — это «delegate» адрес.
Комментарий для me.yahoo.com/kuchin:
Так надо и указывать «delegate», а не «local»
Yahoo не поддерживает OpenID 1.х, только 2.0, а там не выставить delegate. Поменял сервер на Yandex.
эээ, UnhandledException
message: Undefined variable: MyObject
это ж не пехапе всетаки какой
а, понял, если объект есть, а свойства с таким именем нет.
коряво, да.
Комментарий для vkv.livejournal.com:
Да это я сам напутал. Неожиданно оказалось, что надо на встречу и сырой текст пришлось запостить как есть.
Здесь акцент именно на особенности реализации with в VBScript?
В нём, в уродливом VBScript, и с «коллекциями» совсем другой коленкор. Я его позабыл уже, а порой ведь хотелось делать inline-вставки в JScript.
Или тема вообще о непригодности with ни для чего?
Комментарий для boltai-shaltai:
Тут написано о том, что в VBScript конструкция «with» сделана лучше. Кажется немного текста же?
Странный тон, Евгений (
Ну глупый вопрос, да. Вероятно, мне хотелось услышать несколько слов «о вредности with» безотносительно бейсика.
http://stackoverflow.com/questions/61552/are-there-legitimate-uses-for-javascripts-with-statement видели?
Комментарий для boltai-shaltai:
Пардон, не хотел обидеть.
Я как раз написал о недостатках with и пути их решения.
Комментарий для jankkhvej.blogspot.com:
Про let? Да, я знаком с этой конструкцией в JS.