gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:43:02 24 4
gpt4 key购买 nike

所以我正在用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com