为了账号安全,请及时绑定邮箱和手机立即绑定

JavaScript - 局部类变量会被垃圾收集吗?

JavaScript - 局部类变量会被垃圾收集吗?

大话西游666 2022-12-22 10:04:08
我有一个类使用递归在打字机风格的角色对话屏幕中播放 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 对象吗?我使用这种方法是因为我喜欢它听起来比在构造函数中创建一个 Audio() 并将其重新设置为 0 时间或仅在文件播放完成时重播更喜欢它。这种方法会严重拖累内存吗?我尝试使用开发工具的内存面板,但我不确定我是否正确解释它并且不确定它将如何扩展......
查看完整描述

1 回答

?
杨魅力

TA贡献1811条经验 获得超5个赞

长话短说;博士;是的,它会被清理干净

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

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

反正。如果该变量仅用于 do sfx.play(),那么它将从内存中清除。

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


查看完整回答
反对 回复 2022-12-22
  • 1 回答
  • 0 关注
  • 54 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信