В следующем примере вычисления выполняются с областью видимости, расширенной объектом 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".
Возможно нубский вопрос, но думаю будет интересен кому-то.
Если посмотреть описание блока - то он не создает области видимости
Однако, with должен создать область видимости - но это не работает
Может быть, стоит в описании var указать такой момент, что даже при создании новой области видимости, в var все же будет использоваться текущий вызов функции.
Без var тоже будут проблемы
Теперь становится понятно - with не может использоваться для изменения созданной области видимости, только чтение.
Извиняюсть, пример без var был некорректен. Исправлено:
Вот еще интересное поведение with:
Объясняется просто: объявления var всегда всплывают наверх.
В скоупе изменяется первая найденная переменная.
Код получается аналогичен этому:
долой "use strict"
использовать with гораздо удобнее чем перед каждым именем из подключаемой библиотеки писать lib. или Math.
а перед обработкой минификатором надо написать какой-нибудь скрипт, который будет ставить перед определенными именами соответствующие lib. или Math.
или например через си-шный препроцессор прогнать