Использование с в JavaScript плохой практикой? - PullRequest
4 голосов
/ 28 декабря 2010

Я думаю, что такие вещи, как with(Math){document.body.innerHTML= PI} не совсем хорошая практика.

Ответы [ 3 ]

5 голосов
/ 28 декабря 2010

Я бы назвал это плохой практикой, учитывая, как это влияет на цепочку областей действия.

Взгляните на эту статью Дугласа Крокфорда: " с утверждением, которое считается вредным "

4 голосов
/ 28 декабря 2010

Краткая сводка ссылки в ответе Мэтта состоит в том, что проблема с использованием оператора «with» состоит в том, что переменные в блоке «with» являются неоднозначными.Используя следующий пример:

with(foo.doo.diddly.doo){
  bar = 1;
  baz = 1;
}

Если вы не совсем уверены, что foo.doo.diddly.doo имеет свойства bar или baz, вы не знаете, есть ли bar и baz внутри оператора withисполняются, или какой-то глобальный бар и баз.Лучше использовать переменные:

var obj = foo.doo.diddly.doo;

obj.bar = 1;
obj.baz = 1;

В вашем примере, однако, Math вряд ли достаточно длинный термин, чтобы оправдать даже использование переменной, но я предполагаю, что вы имеете в виду более подробное приложение, чем выиспользовал для вопроса.

0 голосов
/ 28 декабря 2010

Если вы обращаетесь к (вложенным) свойствам объекта один раз, тогда нет необходимости «кэшировать» их.

Но если вы обращаетесь к ним более одного раза, вам следует сохранить ссылку в локальной переменной. Это имеет два преимущества:

  1. (вложенные) свойства не нужно искать более одного раза (возможно, в цепочке наследования, которая медленная!).
  2. Особенно глобальные объекты (но любой объект, который не входит в текущую область видимости) нужно искать только один раз в цепочке областей действия. Последующий доступ будет быстрее.

А теперь соединение с with:

Создает новую область в начале текущей цепочки областей. Это означает, что любой доступ к другим переменным / объектам будет стоить как минимум на одну область поиска больше, даже для переменных, которые являются локальными для функции.

...