#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 в начало функции, т. Е. вне каких-либо циклов.