登录
首页 >  文章 >  前端

防抖代码版本 1 和版本 2 执行结果不同的原因是什么?

时间:2024-11-28 16:02:30 481浏览 收藏

一分耕耘,一分收获!既然打开了这篇文章《防抖代码版本 1 和版本 2 执行结果不同的原因是什么? 》,就坚持看下去吧!文中内容包含等等知识点...希望你能在阅读本文后,能真真实实学到知识或者帮你解决心中的疑惑,也欢迎大佬或者新人朋友们多留言评论,多给建议!谢谢!

防抖代码版本 1 和版本 2 执行结果不同的原因是什么?

防抖代码的不同结果剖析

在提供的一段防抖代码中,开发者发现版本 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 执行结果不同的原因是什么? 》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多文章知识!

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>