В следующем примере вычисления выполняются с областью видимости, расширенной объектом 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'
Аналог using namespace своеобразный) Полезный, ибо обычные переменные захламляют рабочий namespace.
"+100500". Переменные мало того, что захламляют namespace, но ещё и требуют труда на придумывание имени. В общем, чем из меньше, тем лучше. Ну а когда scope не выделен в отдельный блок, и переменная по имени пересекается с чем-нибудь, то вообще плавающий глюк с трудностями отладки обеспечен...
Синтаксис кодов поправьте, точек с запятой нет.
Го учить матчасть. Точка с запятой в javascript не обязательны.
но желательны. Го учить матчасть
Точка с запятой может и необязательна в javascript, но очень желательны в наглядных примерах для обучения новичков, т.к.
код; код; - будет работать, а
код код - работать не будет и новичка это может поставить в тупик, да и привыкать полезно ведь во всех остальных языках (си, паскаль, actionscript, пхп и т.п.) это правило обязательно!
А ещё в javascript более чем желательно не переносить на новую строку выражение
, иначе интерпретатор увидев, что в данном случае конец строки синтаксически "катит" в качестве конца выражения, воспримет "return" и "(2 + 2)" отдельно - хотя и синтаксических ошибок не будет, но вместо 4 вернёт null. При этом переносить
вполне безопасно - тут конец строки рвёт выражение посередине, и у интерпретатора не возникает соблазна считать коней строки концом выражения.
Ребят, скажите, а как потом использовать значение переменной, посчитанной внутри блока? После "}" они уже не сохраняются..
Объявиться переменную вне блока with()
Оформить как вызов анонимной функции ;-). Вообще, в JavaScript, IMHO, операторы var, if, with и while - лишние и представляют собой всего лишь синтаксический сахар ;-)
Если одна из глобальных переменных или переменных функции, вызвавшей конструкцию "with", совпадает с именем свойства текущего объекта, то к первой можно обратиться, используя "this".
var v1 = 523; var obj1 = {'v1': 375} with (obj1) { alert('v1 = '+this.v1); // v1 = 523 }Возможно нубский вопрос, но думаю будет интересен кому-то.
Если посмотреть описание блока - то он не создает области видимости
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 не может использоваться для изменения созданной области видимости, только чтение.
Извиняюсть, пример без var был некорректен. Исправлено:
(function () { var c = {}; with(c) { x = 2; } console.log(c.x); }) ();Вот еще интересное поведение 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);долой "use strict"
использовать with гораздо удобнее чем перед каждым именем из подключаемой библиотеки писать lib. или Math.
а перед обработкой минификатором надо написать какой-нибудь скрипт, который будет ставить перед определенными именами соответствующие lib. или Math.
или например через си-шный препроцессор прогнать