Javascript.RU

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.


Автор: Flammar (не зарегистрирован), дата: 18 марта, 2014 - 11:47
#permalink

"+100500". Переменные мало того, что захламляют namespace, но ещё и требуют труда на придумывание имени. В общем, чем из меньше, тем лучше. Ну а когда scope не выделен в отдельный блок, и переменная по имени пересекается с чем-нибудь, то вообще плавающий глюк с трудностями отладки обеспечен...


Автор: Гость (не зарегистрирован), дата: 21 января, 2011 - 01:08
#permalink

Синтаксис кодов поправьте, точек с запятой нет.


Автор: trikadin, дата: 14 июля, 2011 - 16:07
#permalink

Го учить матчасть. Точка с запятой в javascript не обязательны.


Автор: Гость (не зарегистрирован), дата: 10 октября, 2012 - 10:05
#permalink

var my = {}
var my = {};

Оба варианта рабочие - так нужна ли точка с запятой? Да, так как первый вариант не пройдет опфускацию в случае необходимости. Потом - принято выражение закрывать точкой с запятой, так что все, что использует знак равенства должно быть закрыто. Кроме того - попробуйте в цикле for обойтись без "необязательной точки с запятой". Так что - го учить матчасть, бестолочь! Вот из-за таких недоумков потом нормальным пацанам приходится вычитывать тонны непонятной ахинеи...


Автор: Гость (не зарегистрирован), дата: 10 ноября, 2011 - 21:53
#permalink

но желательны. Го учить матчасть


Автор: АндрейMercury (не зарегистрирован), дата: 18 января, 2012 - 03:58
#permalink

Точка с запятой может и необязательна в javascript, но очень желательны в наглядных примерах для обучения новичков, т.к.
код; код; - будет работать, а
код код - работать не будет и новичка это может поставить в тупик, да и привыкать полезно ведь во всех остальных языках (си, паскаль, actionscript, пхп и т.п.) это правило обязательно!


Автор: Flammar (не зарегистрирован), дата: 18 марта, 2014 - 11:55
#permalink

А ещё в javascript более чем желательно не переносить на новую строку выражение

return 
(2 + 2)

, иначе интерпретатор увидев, что в данном случае конец строки синтаксически "катит" в качестве конца выражения, воспримет "return" и "(2 + 2)" отдельно - хотя и синтаксических ошибок не будет, но вместо 4 вернёт null. При этом переносить

return (2 
+ 2)

вполне безопасно - тут конец строки рвёт выражение посередине, и у интерпретатора не возникает соблазна считать коней строки концом выражения.


Автор: Dazar (не зарегистрирован), дата: 16 марта, 2012 - 17:19
#permalink

Ребят, скажите, а как потом использовать значение переменной, посчитанной внутри блока? После "}" они уже не сохраняются..


Автор: Гость (не зарегистрирован), дата: 23 сентября, 2012 - 10:55
#permalink

Объявиться переменную вне блока with()


Автор: Flammar (не зарегистрирован), дата: 18 марта, 2014 - 11:58
#permalink

Оформить как вызов анонимной функции ;-). Вообще, в JavaScript, IMHO, операторы var, if, with и while - лишние и представляют собой всего лишь синтаксический сахар ;-)


Автор: 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.
или например через си-шный препроцессор прогнать


Автор: Гость (не зарегистрирован), дата: 16 апреля, 2022 - 00:50
#permalink

Автор: Гость (не зарегистрирован), дата: 16 апреля, 2022 - 13:09
#permalink

Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
8 + 9 =
Введите результат. Например, для 1+3, введите 4.
 
Поиск по сайту
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

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

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