JavaScript中直接访问元素属性与先赋值给变量哪种执行速度更快?
结论优先:先把currentTime赋值给本地变量的写法更好,同时具备性能优势和逻辑一致性优势
性能差异原因
track.currentTime不是普通JavaScript对象属性,它是浏览器暴露的DOM getter接口:每次读取操作都需要JS上下文和浏览器原生媒体播放模块做数据同步,涉及跨层调用开销。而本地变量是直接在JS栈内存读取,开销几乎可以忽略。
在ontimeupdate这种每秒触发4~6次的高频回调里,单次读取的开销虽然小,但多次读取的累积效应是可感知的:相关基准测试显示,同一段回调里重复读取currentTime 3次以上的场景,比单次读取存变量的写法慢2~8倍,不同浏览器内核下差异会更大。
额外的逻辑收益
如果在回调里多次读取currentTime,有可能两次读取的间隙刚好触发了媒体时间更新,导致你计算分钟、秒数、进度条用的不是同一个时间快照,极端场景下会出现时间显示跳变、进度条和时间显示不同步的问题。提前存一次变量就能保证整个回调逻辑用的是同一个时间值,完全规避这类偶发问题。
可选优化点
如果当前播放的音频源没有动态切换、码率调整的场景,你还可以提前把1000 / track.duration这个固定计算值缓存到全局变量,不用每次回调都重复计算,能进一步降低回调开销。
内容的提问来源于stack exchange,提问作者Cornelius Qualley
相关产品推荐
相关产品推荐

