зло with
На днях вспоминал название оператора в javascript, который уменшает написание (физическое набивание) иерархии обьектов в классе, массиве и тд. Нашёл. Это with. Если раньше я писал:
test_obj.wtf.count = data.count;
test_obj.wtf.price = data.price;
test_obj.wtf.shit = data.shit;
test_obj.wtf.shit2 = data.shit2;
То это-же можно записать так:
with (test_obj.wtf){
count = data.count;
price = data.price;
shit = data.shit;
shit2 = data.shit2;
}
Как бы всё хорошо и удобно. Но вот мне на глаза попалась статья на YUI-блоге, которую и попробую перевести.
Оператор with считается вредным
Оператор JavaScript with был предусмотрен для обеспечения сокращенного написания повторяющихся конструкций языка. Так вместо
ooo.eee.oo.ah_ah.ting.tang.walla.walla.bing = true;
ooo.eee.oo.ah_ah.ting.tang.walla.walla.bang = true;
Можно написать
with (ooo.eee.oo.ah_ah.ting.tang.walla.walla) {
bing = true;
bang = true;
}
Так выглядить гламурненько. Кроме одной вещи. Не существует способа узнать, смотря на код, которую переменную bing и bang будет исменено. ooo.eee.oo.ah_ah.ting.tang.walla.walla изменяется? Или глобальные переменные bing и bang будут затёрты? Конечно, это возможно узнать.
Оператор with добавляет элементы обьекта к тукущей области видимости. Только если есть bing в ooo.eee.oo.ah_ah.ting.tang.walla.walla, будет достук к ooo.eee.oo.ah_ah.ting.tang.walla.walla.bing.
Если вы не можете прочитать программу и не уверены, что вы знаете, что оно делает, вы не можете быть уверены, что программа будет работать корректно. По этой причине, оператор with следует избегать.
К счастью, JavaScript имеет альтернативу получше. Можно просто определить var.
var o = ooo.eee.oo.ah_ah.ting.tang.walla.walla;
o.bing = true;
o.bang = true;
Теперь без двузначности. Теперь можем быть уверены, что ooo.eee.oo.ah_ah.ting.tang.walla.walla.bing и ooo.eee.oo.ah_ah.ting.tang.walla.walla.bang будут определены и не какие-то несчастные переменные.
Оригинал: with Statement Considered Harmful
Вывод: хорошо, что я забыл о этом операторе. Помню, камрад Сидоров ещё говорил, что это плохо. И глобальные переменные это что? Это – плохо!!! На yuiblog.com надеюсь эти слова знают )

