зло 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 надеюсь эти слова знают )

  1. No comments yet.
  1. No trackbacks yet.