Справочник javascript: with

Форум

Учебник Node.JS скринкаст Стандарт языка

Справочник

Discord чат

 
Статьи Тест знаний Аналоги функций PHP  

with

Добавить новую область видимости

Синтаксис

with (object)
  statement

Аргументы

object
Добавить указанный объект в цепочку областей видимости. Может быть любое выражение, скобки вокруг обязательны.
statement
Блок или javascript-вызов для выполнения внутри дополненной области видимости

Описание, примеры

В следующем примере вычисления выполняются с областью видимости, расширенной объектом 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.
или например через си-шный препроцессор прогнать


 
Поиск по сайту
Содержание

Дерево всех статей

Последние темы на форуме
Forum