【问题标题】:JavaScript - do local class variables get garbage collected?JavaScript - 本地类变量会被垃圾收集吗?
【发布时间】:2020-11-25 07:47:29
【问题描述】:

我的问题类似于Do local variables inside of a loop get garbage collected?

我有一个类使用递归在打字机风格的角色对话屏幕中播放 blip 音效:

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 时间或仅在文件完成播放时重放。

这种方法会严重拖累记忆吗?我尝试使用开发工具的内存面板,但我不确定我是否正确解释它并且不确定它将如何扩展......

【问题讨论】:

    标签: javascript performance memory


    【解决方案1】:

    TL;DR;是的,它会被清除

    回答: 有可能不会被清除。如果您曾经存储该 sfx 变量以供以后使用(假设您添加到某种形式的事件、超时等...),那么它将在该侦听器执行后被清除。

    这是一个非常特殊的问题,请记住这一点!例如,如果您有一个事件发射器并将一个函数附加到一个 on 事件,那么该函数将不会从内存中清除(例如)。

    无论如何。如果该变量仅用于执行sfx.play(),那么它将从内存中清除。

    一个小建议。为什么不创建一个类变量让我们说:this.blipSound = new Audio(),并在需要的地方使用this.blipSound.play(),您不必每次都按照您的建议将其设置为 null 或 0,只需保留它即可?这样您就不必担心内存泄漏,因为该类只有一个实例?

    【讨论】:

    • 感谢您的帮助!我没有使用该类的一个实例,因为如果我调用this.blipSound.play(),它只会在实例完成播放后重新播放并且我希望声音重叠
    • 知道了!我很确定这是有原因的,但提及它并没有什么坏处
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多