Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

Конструкция "with"

Лекция



Привет, сегодня поговорим про конструкция "with", обещаю рассказать все что знаю. Для того чтобы лучше понимать что такое конструкция "with" , настоятельно рекомендую прочитать все из категории Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend).


  1. Пример
  2. Изменения переменной
  3. Почему отказались от with?
    1. Замена with
  4. Итого

Конструкция with позволяет использовать для области видимости произвольный объект.

В современном JavaScript от этой конструкции отказались, в строгом режиме она не работает, но ее еще можно найти в старом коде.

Синтаксис:

with(obj) {
  ... код ...
}

 

Любое обращение к переменной внутри with сначала ищет ее среди свойств obj, а только потом — вне with.

Пример

В примере ниже переменная будет взята не из глобальной области, а из obj:

   
1 var a = 5;
2  
3 var obj = { a : 10 };
4  
5 with(obj) {
6   alert(a); // 10, из obj
7 }

 

Попробуем получить переменную, которой в obj нет:

 

   
1 var b = 1;
2  
3 var obj = { a : 10 };
4  
5 with(obj) {
6   alert(b); // 1, из window
7 }

 

Здесь интерпретатор сначала проверяет наличие obj.b, не находит и идет вне with.

Особенно забавно выглядит применение вложенных with:

 

   
01 var obj = {
02   weight: 10,
03   size: {
04     width: 5,
05     height: 7
06   }
07 };
08  
09 with(obj) {
10   with(size) { // size будет взят из obj
11     alert( width*height / weight ); // width,height из size, weight из obj
12   }
13 }

 

Свойства из разных объектов используются как обычные переменные… Магия! Порядок поиска переменных в выделенном коде: size => obj => window

Конструкция with

Изменения переменной

При использовании with, как и во вложенных функциях — переменная изменяется в той области, где была найдена.

Например:

 

   
1 var obj = { a : 10 }
2  
3 with(obj) {
4   a = 20;
5 }
6 alert(obj.a); // 20, переменная была изменена в объекте

 

Почему отказались от with?

Есть несколько причин.

  1. В современном стандарте JavaScript отказались от with, потому что конструкция withподвержена ошибкам и непрозрачна.

    Проблемы возникают в том случае, когда в with(obj) присваивается переменная, которая по замыслу должна быть в свойствах obj, но ее там нет.

    Например:

       
    1 var obj = { weight: 10 };
    2  
    3 with(obj) {
    4   weight = 20; // (1)
    5   size = 35;   // (2)
    6 }
    7  
    8 alert(obj.size);
    9 alert(window.size);

     

    В строке (2) присваивается свойство, отсутствующее в obj. Об этом говорит сайт https://intellect.icu . В результате интерпретатор, не найдя его, создает новую глобальную переменную window.size.

    Такие ошибки редки, но очень сложны в отладке, особенно если size изменилась не в window, а где-нибудь во внешнем LexicalEnvironment.

  2. Еще одна причина — алгоритмы сжатия JavaScript не любят with. Перед выкладкой на сервер JavaScript сжимают. Для этого есть много инструментов, например Closure Compiler и UglifyJS. Если вкратце — они либо сжимают код с with с ошибками, либо оставляют его частично несжатым.
  3. Ну и, наконец, производительность — усложнение поиска переменной из-за with влечет дополнительные накладные расходы. Современные движки применяют много внутренних оптимизаций, ряд которых не могут быть применены к коду, в котором есть with.

    Вот, к примеру, запустите этот код в современном браузере. Производительность функции fastсущественно отличается slow с пустым(!) with. И дело тут именно в with, т.к. наличие этой конструкции препятствует оптимизации.

     

       
    01 var i = 0;
    02  
    03 function fast() {
    04   i++;
    05 }
    06  
    07 function slow() {
    08   with(i) {}
    09   i++;
    10 }
    11  
    12  
    13 var time = new Date();
    14 while(i < 1000000) fast();
    15 alert(new Date - time);
    16  
    17 var time = new Date();
    18 i=0;
    19 while(i < 1000000) slow();
    20 alert(new Date - time);

     

Замена with

Вместо with рекомендуется использовать временную переменную, например:

01 /* вместо
02 with(elem.style) {
03   top = '10px';
04   left = '20px';
05 }
06 */
07  
08 var s = elem.style;
09  
10 s.top = '10px';
11 s.left = '0';

 

Это не так элегантно, но убирает лишний уровень вложенности и абсолютно точно понятно, что будет происходить и куда присвоятся свойства.

Итого

  • Конструкция with(obj) { ... } использует obj как дополнительную область видимости. Все переменные, к которым идет обращение внутри блока, сначала ищутся в obj.
  • Конструкция with устарела и не рекомендуется по ряду причин. Избегайте ее.

 

Важность: 5

Какая из функций будет вызвана?

1 function f() { alert(1) }
2  
3 var obj = {
4   f: function() { alert(2) }
5 };
6  
7 with(obj) {
8   f();
9 }

 

Решение

Вторая (2), т.к. при обращении к любой переменной внутри with — она ищется прежде всего в объекте.

Соответственно, будет выведено 2:

   
1 function f() { alert(1) }
2  
3 var obj = {
4   f: function() { alert(2) }
5 };
6  
7 with(obj) {
8   f();
9 }

 

[Открыть задачу в новом окне]

Важность: 5

Что выведет этот код?

1 var a = 1;
2  
3 var obj = { b: 2 };
4  
5 with(obj) {
6   var b;
7   alert( a + b );
8 }

 

Решение

Выведет 3.

Конструкция with не создает области видимости, ее создают только функции. Поэтому объявление var b внутри конструкции работает также, как если бы оно было вне ее.

Код в задаче эквивалентен такому:

 

   
1 var a = 1;
2 var b;
3  
4 var obj = { b: 2 }
5  
6 with(obj) {
7   alert( a + b );

К сожалению, в одной статье не просто дать все знания про конструкция "with". Но я - старался. Если ты проявишь интерес к раскрытию подробностей,я обязательно напишу продолжение! Надеюсь, что теперь ты понял что такое конструкция "with" и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend)

Из статьи мы узнали кратко, но содержательно про конструкция "with"
создано: 2014-10-07
обновлено: 2024-11-14
245



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей

Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend)

Термины: Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend)