Увеличивает ли использование var в ограниченном цикле JavaScript накладные расходы, связанные с памятью?

#javascript #memory-management

#javascript #управление памятью

Вопрос:

Например, будет ли это:

 while (true) {
    var random = Math.random();
}
  

… быть менее эффективным, чем следующее, в большинстве реализаций?

 var random;
while (true) {
    random = Math.random();
}
  

Спасибо за ваш вклад.

Редактировать: На случай, если это не было очевидно, меня больше всего беспокоит множество повторяющихся (де) распределений, происходящих в этом примере.

Комментарии:

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

2. @NoProblem: JavaScript не имеет области действия блока. Пожалуйста, не вводите в заблуждение. Это не вопрос мнения.

Ответ №1:

В JavaScript нет области видимости блока.

В первом примере var text объявление выводится из while блока. В обоих случаях переменная объявляется только один раз. В обоих случаях переменной присваивается значение один раз за итерацию while цикла.

var

  • function -область действия
  • поднимите на вершину его функции
  • повторные объявления с тем же именем в той же области не выполняются

Комментарии:

1.Понятно, спасибо! Итак, благодаря этому достоинству это: var random; var interval = setInterval(foo, 100); function foo() { random = Math.random(); на самом деле быстрее, чем если бы var было перемещено внутри foo?

2. @BHSPit сохранение объявления снаружи не обязательно быстрее . Я могу сказать, что вероятно , будет выделено меньше памяти с var outside, но есть много других соображений. Например, браузер может выполнять различные оптимизации с объявлением внутри, а не снаружи. Что-то еще, что может повлиять на скорость, — это поиск переменной внутри foo .

3. @BHSPit по большей части, все это, вероятно, микрооптимизация, но вам может быть интересно ознакомиться с высокопроизводительным JavaScript . Это хорошо написанная книга. Прямо сейчас у меня на столе лежит копия.

4. Обновление для 2019. В JavaScript теперь есть область видимости блока с помощью let и const .

Ответ №2:

Нет, переменные инициируются при входе в область видимости, поэтому random существуют даже до достижения оператора var.

Комментарии:

1. В вашем ответе отсутствует важная информация: у JS нет области действия блока, только область действия функции (и глобальная).

2. Я хочу сказать, что многократное повторение var инструкции в одной и той же области видимости ничего не дает в JavaScript, кроме того, что var выполняется вне цикла.

3. Верно… но единственная причина, по которой это так, заключается в том, что JS не имеет области видимости блока, о которой OP явно не знает. Если бы JS действительно имел область видимости блока, то переменная все равно могла бы быть «инициирована при входе в область видимости» (как вы говорите), но «область видимости» означала бы «тело while цикла», а не «тело функции».

Ответ №3:

JavaScript не имеет области видимости блока, и random объявление в любом случае было бы поднято на вершину его области видимости (переменный объект).

Ответ №4:

Это зависит от реализации интерпретатора. Строго говоря, да, это может иметь немного более высокие накладные расходы; но в зависимости от механизма GC это тоже должно быть устранено достаточно быстро.

Ответ №5:

Дуглас Крокфорд рекомендует помещать все назначения var в начало функции, т. Е. вне каких-либо циклов.