performance.now() 更适合防抖,因其返回相对于 navigationStart 的高精度、单调递增时间戳(精度达微秒级),不受系统时钟跳变影响;而 Date.now() 依赖系统时钟,分辨率低(1–15ms)且可能因 NTP 同步导致时间回拨或前跳,引发负值或异常大时间差。

用 performance.now() 替代 Date.now() 做防抖时间差计算,核心是为了获取更精确、单调递增的毫秒级时间戳(精度可达微秒级),避免系统时钟调整或低分辨率带来的误差。
为什么 performance.now() 更适合防抖
performance.now() 返回的是相对于页面导航(navigationStart)的高精度时间戳,单位为毫秒,小数部分表示微秒(如 12345.678),且不受系统时间跳变影响;而 Date.now() 依赖系统时钟,分辨率通常只有 1–15ms(尤其在旧浏览器或后台标签页中),还可能因 NTP 同步突然回拨/前跳,导致时间差为负或异常大。
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
防抖函数中替换的关键点
- 初始化时记录首次触发的
performance.now()值(而非Date.now()) - 每次新触发时,用当前
performance.now()减去上次记录值,得到真实经过时间 - 清除定时器和更新时间戳都基于同一时间源,保证逻辑一致性
一个使用 performance.now() 的防抖示例
以下是一个轻量、可复用的防抖实现:
function debounce(func, wait) {
let timeoutId = null;
let lastTime = 0;
<p>return function (...args) {
const now = performance.now();
const elapsed = now - lastTime;</p><pre class="brush:php;toolbar:false;">if (timeoutId) {
clearTimeout(timeoutId);
}
if (elapsed >= wait) {
func.apply(this, args);
lastTime = now;
} else {
timeoutId = setTimeout(() => {
func.apply(this, args);
lastTime = performance.now();
}, wait - elapsed);
}}; }
注意:这里用 elapsed 判断是否已过等待期,比单纯依赖 setTimeout 更精准——尤其在高频连续触发场景下,能避免因定时器延迟累积导致的实际间隔偏离预期。
实际使用中的注意事项
- 所有时间相关计算(包括
wait参数)都应理解为毫秒,performance.now()输出虽带小数,但防抖对亚毫秒级差异不敏感,无需额外四舍五入 - 若需兼容 IE9–IE10,需 fallback 到
Date.now()(它们不支持performance.now),可用performance?.now?.() || Date.now() - 不要将
performance.now()结果用于跨页面或持久化存储——它只在当前页面生命周期内有意义

















