JavaScript - собираются ли локальные переменные класса сборщиком мусора? - PullRequest
2 голосов
/ 05 августа 2020

Мой вопрос похож на Собирают ли локальные переменные внутри al oop сборщик мусора?

У меня есть класс, который использует рекурсию для воспроизведения звукового эффекта всплеска в стиле пишущей машинки экран диалога персонажей:

class DialogueBox extends Component{

    constructor(props){
        super(props)
        this.state = {...
        }
        ...
    }
      

    typeWriter(txt,i,speed=50) {
      if(i==txt.length){
        ...
        return
      }
      else{
          // a blip sound effect plays on every new character typed
          let sfx =  new Audio(speechBlip);
          sfx.play();
          ...
          setTimeout(()=>this.typeWriter(txt,i+1,speed),speed);

      }

    }

Обратите внимание на локальную переменную let sfx = new Audio(speechBlip), которая создается несколько раз. Приведет ли это к тому, что в памяти будет храниться тонна аудиообъектов, которые никогда не будут очищены?

Я использую этот метод, потому что мне нравится его звучание больше, чем создание одного Audio () в конструкторе и его повторное использование. установка его на 0 раз или воспроизведение только после завершения воспроизведения файла.

Будет ли этот метод большим перетаскиванием памяти? Я пробовал использовать панель памяти инструментов разработчика, но не уверен, правильно ли я ее интерпретирую, и не уверен, как она будет масштабироваться ...

1 Ответ

2 голосов
/ 05 августа 2020

TL; DR; да, он будет очищен

Ответ: Есть вероятность, что он не будет очищен. если вы когда-нибудь сохраните эту переменную sfx для последующего использования (допустим, вы добавите к некоторой форме события, тайм-аут и т. д. c ...), то она будет очищена после выполнения этого слушателя.

Это это очень ситуативная проблема, имейте это в виду! Если, например, у вас есть эмиттер событий и вы присоединяете функцию к событию on, то эта функция не будет удалена из памяти (например).

В любом случае. Если эта переменная используется только для выполнения sfx.play(), она будет удалена из памяти.

Небольшое предложение. Почему бы вам не создать переменную класса, скажем: this.blipSound = new Audio(), и использовать this.blipSound.play() там, где вам это нужно, вам не нужно каждый раз устанавливать значение null или 0, как вы предлагали, просто сохраните ее? Таким образом, вам не придется беспокоиться об утечках памяти, поскольку будет один экземпляр класса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...