防抖代码版本 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 执行结果不同的原因是什么?的详细内容,更多请关注其它相关文章!