ÐонÑÑÑÑкÑÐ¸Ñ with позволÑÐµÑ Ð¸ÑполÑзоваÑÑ Ð² каÑеÑÑве облаÑÑи видимоÑÑи Ð´Ð»Ñ Ð¿ÐµÑеменнÑÑ
пÑоизволÑнÑй обÑекÑ.
Ð ÑовÑеменном JavaScript Ð¾Ñ ÑÑой конÑÑÑÑкÑии оÑказалиÑÑ. С use strict она не ÑабоÑаеÑ, но ÐµÑ ÐµÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ найÑи в ÑÑаÑом коде, Ñак ÑÑо ÑÑÐ¾Ð¸Ñ Ð¿Ð¾Ð·Ð½Ð°ÐºÐ¾Ð¼Ð¸ÑÑÑÑ Ñ Ð½ÐµÐ¹, ÑÑÐ¾Ð±Ñ ÐµÑли ÑÑо â понимаÑÑ, о ÑÑм ÑеÑÑ.
СинÑакÑиÑ:
with(obj) {
...код...
}
ÐÑбое обÑаÑение к пеÑеменной внÑÑÑи with ÑнаÑала иÑÐµÑ ÐµÑ ÑÑеди ÑвойÑÑв obj, а ÑолÑко поÑом â вне with.
ÐÑимеÑ
РпÑимеÑе ниже пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð±ÑÐ´ÐµÑ Ð²Ð·ÑÑа не из глобалÑной облаÑÑи, а из obj:
var a = 5;
var obj = {
a: 10
};
with(obj) {
alert( a ); // 10, из obj
}
ÐопÑобÑем полÑÑиÑÑ Ð¿ÐµÑеменнÑÑ, коÑоÑой в obj неÑ:
var b = 1;
var obj = {
a: 10
};
with(obj) {
alert( b ); // 1, из window
}
ÐдеÑÑ Ð¸Ð½ÑеÑпÑеÑаÑÐ¾Ñ ÑнаÑала пÑовеÑÑÐµÑ Ð½Ð°Ð»Ð¸Ñие obj.b, не наÑ
Ð¾Ð´Ð¸Ñ Ð¸ идÑÑ Ð²Ð½Ðµ with.
ÐÑобенно забавно вÑглÑÐ´Ð¸Ñ Ð¿Ñименение вложеннÑÑ
with:
var obj = {
weight: 10,
size: {
width: 5,
height: 7
}
};
with(obj) {
with(size) { // size бÑÐ´ÐµÑ Ð²Ð·ÑÑ Ð¸Ð· obj
alert( width * height / weight ); // width,height из size, weight из obj
}
}
СвойÑÑва из ÑазнÑÑ
обÑекÑов иÑполÑзÑÑÑÑÑ ÐºÐ°Ðº обÑÑнÑе пеÑеменнÑе⦠ÐагиÑ! ÐоÑÑдок поиÑка пеÑеменнÑÑ
в вÑделенном коде: size => obj => window.
ÐÐ·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿ÐµÑеменной
ÐÑи иÑполÑзовании with, как и во вложеннÑÑ
ÑÑнкÑиÑÑ
â пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¸Ð·Ð¼ÐµÐ½ÑеÑÑÑ Ð² Ñой облаÑÑи, где бÑла найдена.
ÐапÑимеÑ:
var obj = {
a: 10
}
with(obj) {
a = 20;
}
alert( obj.a ); // 20, пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð±Ñла изменена в обÑекÑе
ÐоÑÐµÐ¼Ñ Ð¾ÑказалиÑÑ Ð¾Ñ with?
ÐÑÑÑ Ð½ÐµÑколÑко пÑиÑин.
-
Ð ÑовÑеменном ÑÑандаÑÑе
JavaScriptоÑказалиÑÑ Ð¾Ñwith, поÑÐ¾Ð¼Ñ ÑÑо конÑÑÑÑкÑиÑwithподвеÑжена оÑибкам и непÑозÑаÑна.ÐÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÑÑ Ð² Ñом ÑлÑÑае, когда в
with(obj)пÑиÑваиваеÑÑÑ Ð¿ÐµÑеменнаÑ, коÑоÑÐ°Ñ Ð¿Ð¾ замÑÑÐ»Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° бÑÑÑ Ð² ÑвойÑÑваÑobj, но ÐµÑ Ñам неÑ.ÐапÑимеÑ:
var obj = { weight: 10 }; with(obj) { weight = 20; // (1) size = 35; // (2) } alert( obj.size ); alert( window.size );Ð ÑÑÑоке
(2)пÑиÑваиваеÑÑÑ ÑвойÑÑво, оÑÑÑÑÑÑвÑÑÑее вobj. Ð ÑезÑлÑÑаÑе инÑеÑпÑеÑаÑоÑ, не Ð½Ð°Ð¹Ð´Ñ ÐµÐ³Ð¾, ÑоздаÑÑ Ð½Ð¾Ð²ÑÑ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑÑ Ð¿ÐµÑеменнÑÑwindow.size.Такие оÑибки Ñедки, но оÑÐµÐ½Ñ ÑÐ»Ð¾Ð¶Ð½Ñ Ð² оÑладке, оÑобенно еÑли
sizeизменилаÑÑ Ð½Ðµ вwindow, а где-нибÑÐ´Ñ Ð²Ð¾ внеÑнемLexicalEnvironment. -
ÐÑÑ Ð¾Ð´Ð½Ð° пÑиÑина â алгоÑиÑÐ¼Ñ ÑжаÑÐ¸Ñ JavaScript не лÑбÑÑ
with. ÐеÑед вÑкладкой на ÑеÑÐ²ÐµÑ JavaScript ÑжимаÑÑ. ÐÐ»Ñ ÑÑого еÑÑÑ Ð¼Ð½Ð¾Ð³Ð¾ инÑÑÑÑменÑов, напÑÐ¸Ð¼ÐµÑ Closure Compiler и UglifyJS. ÐбÑÑно они пеÑеименовÑваÑÑ Ð»Ð¾ÐºÐ°Ð»ÑнÑе пеÑеменнÑе в более коÑоÑкие имена, но не ÑвойÑÑва обÑекÑов. С конÑÑÑÑкÑиейwithдо запÑÑка кода непонÑÑно â оÑкÑда бÑÐ´ÐµÑ Ð²Ð·ÑÑа пеÑеменнаÑ. ÐоÑÑÐ¾Ð¼Ñ Ð²ÑÑ Ð¾Ð´Ð¸Ñ, ÑÑо, на вÑÑкий ÑлÑÑай (еÑли ÑÑо ÑвойÑÑво), лÑÑÑе ÐµÑ Ð½Ðµ пеÑеименовÑваÑÑ. Таким обÑазом, каÑеÑÑво ÑжаÑÐ¸Ñ ÐºÐ¾Ð´Ð° ÑÑÑадаеÑ. -
ÐÑ Ð¸, наконеÑ, пÑоизводиÑелÑноÑÑÑ â ÑÑложнение поиÑка пеÑеменной из-за
withвлеÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе накладнÑе ÑаÑÑ Ð¾Ð´Ñ.СовÑеменнÑе движки пÑименÑÑÑ Ð¼Ð½Ð¾Ð³Ð¾ внÑÑÑÐµÐ½Ð½Ð¸Ñ Ð¾Ð¿ÑимизаÑий, ÑÑд коÑоÑÑÑ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑименÑн к кодÑ, в коÑоÑом еÑÑÑ
with.ÐоÑ, к пÑимеÑÑ, запÑÑÑиÑе ÑÑÐ¾Ñ ÐºÐ¾Ð´ в ÑовÑеменном бÑаÑзеÑе. ÐÑоизводиÑелÑноÑÑÑ ÑÑнкÑии
fastÑÑÑеÑÑвенно оÑлиÑаеÑÑÑ Ð¾ÑslowÑ Ð¿ÑÑÑÑм(!)with. Рдело ÑÑÑ Ð¸Ð¼ÐµÐ½Ð½Ð¾ вwith, Ñ.к. налиÑие ÑÑой конÑÑÑÑкÑии пÑепÑÑÑÑвÑÐµÑ Ð¾Ð¿ÑимизаÑии.var i = 0; function fast() { i++; } function slow() { with(i) {} i++; } var time = performance.now(); while (i < 1000000) fast(); alert( "Ðез with: " + (performance.now() - time) ); var time = performance.now(); i = 0; while (i < 1000000) slow(); alert( "С with: " + (performance.now() - time) );
Ðамена with
ÐмеÑÑо with ÑекомендÑеÑÑÑ Ð¸ÑполÑзоваÑÑ Ð²ÑеменнÑÑ Ð¿ÐµÑеменнÑÑ, напÑимеÑ:
/* вмеÑÑо
with(elem.style) {
top = '10px';
left = '20px';
}
*/
var s = elem.style;
s.top = '10px';
s.left = '0';
ÐÑо не Ñак ÑлеганÑно, но ÑбиÑÐ°ÐµÑ Ð»Ð¸Ñний ÑÑÐ¾Ð²ÐµÐ½Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾ÑÑи и абÑолÑÑно ÑоÑно понÑÑно, ÑÑо бÑÐ´ÐµÑ Ð¿ÑоиÑÑ Ð¾Ð´Ð¸ÑÑ Ð¸ кÑда пÑиÑвоÑÑÑÑ ÑвойÑÑва.
ÐÑого
- ÐонÑÑÑÑкÑиÑ
with(obj) { ... }иÑполÑзÑеÑobjкак дополниÑелÑнÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑи. ÐÑе пеÑеменнÑе, к коÑоÑÑм идÑÑ Ð¾Ð±ÑаÑение внÑÑÑи блока, ÑнаÑала иÑÑÑÑÑ Ð²obj. - ÐонÑÑÑÑкÑиÑ
withÑÑÑаÑела и не ÑекомендÑеÑÑÑ Ð¿Ð¾ ÑÑÐ´Ñ Ð¿ÑиÑин. ÐзбегайÑе еÑ.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)