JavaScript-本地类变量会被垃圾收集吗



我的问题类似于循环中的局部变量是否被垃圾收集?

我有一个类,它使用递归在打字机风格的字符对话屏幕上播放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次,或者只在文件播放完成时重播。

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

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

答案:它可能不会被清除。如果您存储sfx变量以备将来使用(比如添加到某种形式的事件、超时等(,那么在执行该侦听器后,它将被清除。

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

不管怎样。如果该变量仅用于执行sfx.play(),则它将从内存中清除。

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

最新更新