javascript - 涉及全局变量时Javascript中的垃圾收集

标签 javascript html audio garbage-collection

所以我正在用 html5 的新 <Audio> 构建一个音频播放器标签,但我声明、初始化和操作 <Audio> 序列都在 javascript ( See example here ) 中。基本上 <Audio> 标签一次只允许播放一首歌曲并且很容易操作,所以每当“Next、”“Previous”、“Shuffle”,甚至只是选择另一首歌曲,我将音频标签的 src 替换为包含新歌曲的新 url。

加载时,我声明了变量 song像这样:

var song= new Audio("url");

接下来的所有其他选定歌曲都只是对 song 的覆盖像这样:

song= new Audio("new url");

该方法最终可以正常工作,但是对于每个歌曲实例,事件处理程序会监视诸如 range 之类的事情用于擦洗及其属性 max ,确定范围的长度,以及确定索引落在范围内的位置的值,与 song 的每个先前实例相关联。 .每次我都必须重新分配事件监听器并重新分配此属性,在播放一定数量的歌曲后,性能确实开始受到影响。

我的问题是,即使 javascript 有一个针对不再使用的内存的垃圾收集器,song 的实例都有与之关联的全局事件监听器,所以我认为它们不会被自动删除。有什么方法可以在歌曲被覆盖后立即删除它们吗?是否有完全不同但更好的方法来完成我想要的?

感谢您的帮助和建议!

最佳答案

我决定采取不同的方法来解决这个问题,以完全规避垃圾收集问题。虽然这不一定是对我的问题的直接回答,但它是一个替代的、可行的解决方案。

我最终只是简单地重新分配了 audioInstance.src,假设用一个新的实例覆盖每个 Audio 实例,包含一个新的 url 作为 src。最初,歌曲无法播放,或者涉及元数据的自动播放器的某些部分无法工作,但我发现 this链接,这说明您必须先调用 audio.load(); 当您更改 audio.src 时。

这个:

var audio =  new Audio(url);
addListeners(); //only need to do this once, since the listeners always point to audio declared above
var duration=audio.duration;
audio.play();
audio.src = newurl;
audio.load();
duration=audio.duration;
audio.play();

取而代之的是:

var audio = new Audio(url);
addListeners();
var duration=audio.duration;
audio.play();
audio = new Audio(newUrl);
addListeners(); //need to do this a second time, since the old listeners will always be attached to the old audio instance
duration=audio.duration;
audio.play();

这帮助我达到了我想要的最终结果,并消除了为 Audio 对象的多个实例声明多个监听器时出现的垃圾收集问题。

关于javascript - 涉及全局变量时Javascript中的垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24666911/

相关文章:

javascript - 通过多次使用 switchClass 使类相互淡化

html - 如何使用 CSS 向元素添加类

javascript - DIV中的滚动音频

javascript - AngularJS 中的全局 "App" Controller

javascript - 如何正确观察 Vuex 中的状态变化?

javascript - 如何从 Firefox 开发者工具发起 Ajax 请求?

javascript - 处理表单时显示图像时出错

javascript - 如何选择 10 个随机文件路径插入到 Flash 视频的 div 中?在 JavaScript 中

python - 使用Python分析http MP3音频流

html - 将背景音乐添加到网页