
防抖代码的不同结果剖析
在提供的一段防抖代码中,开发者发现版本 1 和版本 2 执行结果不同,版本 1 防抖失败。
问题根源:递归
关键点在于递归。版本 1 中,if (notCalled && immediate) result = func.apply(context, args); 语句位于递归调用之前,而版本 2 则位于之后。
在版本 1 中,当满足立即执行条件时,执行了 func.apply() 并递归调用自身。问题出在 func.apply() 是同步执行的,它执行了递归调用。由于递归调用仍在继续,notCalled 条件始终为真,导致 func.apply() 被重复执行,这破坏了防抖功能。
而在版本 2 中,if (notCalled && immediate) result = func.apply(context, args); 语句位于递归调用之后。这意味着在条件满足且立即执行时,会执行 func.apply(),并设置超时进行递归调用。此时,notCalled 条件为假,防止 func.apply() 被重复执行,从而实现了正确的防抖功能。
修正版本:
将版本 1 修改为与版本 2 一致,将 if (notCalled && immediate) result = func.apply(context, args); 语句移动到递归调用之后即可解决问题:
function debounce(func, wait, immediate) {
var timeout
var debounced = function () {
var context = this;
var args = arguments;
var notCalled = !timeout;
if (timeout) clearTimeout(timeout);
if (!immediate) func.apply(context, args);
timeout = setTimeout(function () {
if (immediate && notCalled) result = func.apply(context, args);
timeout = null;
}, wait);
};
return debounced;
}以上就是防抖代码版本 1 和版本 2 执行结果不同的原因是什么?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号