В следующем примере вычисления выполняются с областью видимости, расширенной объектом Math.
var a, x, y;
var r = 10;
with (Math) {
a = PI * r * r;
x = r * cos(PI);
y = r * sin(PI / 2);
}
Более частый пример:
with(element.style) {
position = 'relative'
top = left = '5px'
}
При поиске переменной внутри with, интерпретатор сначала проверяет свойства object. Если свойства с таким именем нет - он идет дальше вверх по областям видимости.
Использование with с одной стороны наглядно, с другой - может скрывать ошибки программирования и соответствующий код плохо сжимается компрессорами.
По этим причинам использовать with не рекомендуется.
Вместо этого можно использовать чуть менее наглядный, но надежный доступ через временную переменную:
Пример: переменная вместо with
s = element.style
s.position = 'relative'
s.top = s.left = '5px'
Автор: Архинамон (не зарегистрирован), дата: 1 августа, 2010 - 19:23
#permalinkАналог using namespace своеобразный) Полезный, ибо обычные переменные захламляют рабочий namespace.
Автор: Гость (не зарегистрирован), дата: 21 января, 2011 - 01:08
#permalinkСинтаксис кодов поправьте, точек с запятой нет.
Автор: Гость (не зарегистрирован), дата: 10 ноября, 2011 - 21:53
#permalinkно желательны. Го учить матчасть
Автор: АндрейMercury (не зарегистрирован), дата: 18 января, 2012 - 03:58
#permalinkТочка с запятой может и необязательна в javascript, но очень желательны в наглядных примерах для обучения новичков, т.к.
код; код; - будет работать, а
код код - работать не будет и новичка это может поставить в тупик, да и привыкать полезно ведь во всех остальных языках (си, паскаль, actionscript, пхп и т.п.) это правило обязательно!
Автор: Dazar (не зарегистрирован), дата: 16 марта, 2012 - 17:19
#permalinkРебят, скажите, а как потом использовать значение переменной, посчитанной внутри блока? После "}" они уже не сохраняются..
Автор: Petrovich (не зарегистрирован), дата: 24 октября, 2012 - 17:46
#permalinkЕсли одна из глобальных переменных или переменных функции, вызвавшей конструкцию "with", совпадает с именем свойства текущего объекта, то к первой можно обратиться, используя "this".
var v1 = 523; var obj1 = {'v1': 375} with (obj1) { alert('v1 = '+this.v1); // v1 = 523 }Автор: Гость (не зарегистрирован), дата: 21 января, 2013 - 15:41
#permalinkВозможно нубский вопрос, но думаю будет интересен кому-то.
Если посмотреть описание блока - то он не создает области видимости
var x = 1; { var x = 2; } alert(x); // выведет 2Однако, with должен создать область видимости - но это не работает
var x = 1; with({}) { var x = 2; } alert(x); // выведет 2Может быть, стоит в описании var указать такой момент, что даже при создании новой области видимости, в var все же будет использоваться текущий вызов функции.
Без var тоже будут проблемы
(function () { var x = 1, c = {}; with(c) { x = 2; } console.log(x, c.x); //2, undefined }) ();Теперь становится понятно - with не может использоваться для изменения созданной области видимости, только чтение.
Автор: Гость (не зарегистрирован), дата: 21 января, 2013 - 15:44
#permalinkИзвиняюсть, пример без var был некорректен. Исправлено:
(function () { var c = {}; with(c) { x = 2; } console.log(c.x); }) ();Автор: dpohvar (не зарегистрирован), дата: 4 августа, 2016 - 16:17
#permalinkВот еще интересное поведение with:
var obj = {a:10, b:20, c:30} with(obj) { var b = 400; var c = 200; var d = 500; } console.log(obj); // {a: 10, b: 400, c: 200}Объясняется просто: объявления var всегда всплывают наверх.
В скоупе изменяется первая найденная переменная.
Код получается аналогичен этому:
var b, c, d, obj; obj = {a:10, b:20, c:30} with(obj) { b = 400; // obj.b = 400 c = 200; // obj.c = 200 d = 500; // d = 500 } console.log(obj);Автор: FeelUs, дата: 15 марта, 2017 - 12:44
#permalinkдолой "use strict"
использовать with гораздо удобнее чем перед каждым именем из подключаемой библиотеки писать lib. или Math.
а перед обработкой минификатором надо написать какой-нибудь скрипт, который будет ставить перед определенными именами соответствующие lib. или Math.
или например через си-шный препроцессор прогнать