javascript - 自定义去抖动功能不适用于匿名功能

标签 javascript anonymous-function

我正在尝试创建自定义去抖功能:

const debounced = [];

const cancelFunc = timeout => () => {
  clearTimeout(timeout);
};

function debounce(fn, wait, ...args) {  
  let d = debounced.find(({ func }) => func === fn);

  if (d) {
    d.cancel();  
  } else {
    d = {};
    debounced.push(d);
  }

  d.func = fn;   
  d.timeout = setTimeout(fn, wait, ...args);
  d.cancel = cancelFunc(d.timeout);
}

如果我使用命名函数,它会按预期工作:

debounce(foo, 1000); // called once with 5 clicks in 1 second

但我无法让它与匿名函数一起工作:

debounce(() => { foo(5); }, 1000); // called 5 times with 5 clicks in 1 second

我在这里创建了一支笔:https://codepen.io/anon/pen/gQvMdR?editors=1011

最佳答案

发生这种情况是因为您的find 条件。让我们回过头来,考虑一下这段代码:

if (
    (function(){ return 1 }) === (function(){ return 1 })
) {
    console.log('The functions are equal');
} else {
    console.log('The functions are NOT equal');
}

// logs 'The functions are NOT equal'

尽管我写了两个相同的匿名函数,但它们彼此严格相等。当您传入该匿名函数时,这实际上就是您正在做的事情。因此,当您在数组中搜索之前找到的函数时,它将永远找不到匹配项,因为每次调用 debounce(() => { foo(5); }, 1000);创建了一个新函数。由于它永远找不到匹配项,因此永远不会被取消。

关于javascript - 自定义去抖动功能不适用于匿名功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53415752/

相关文章:

javascript - Groovy 呈现为 JSON java.sql.timestamp 在 JavaScript 中不显示毫秒数

php - 在 PHP 中执行纯匿名函数

php - 闭包参数和 'use' 关键字有什么区别?

javascript - 为什么要使用命名函数表达式?

javascript - 如何定义const函数javascript(语法糖)?

Javascript 图像 - 响应中的访问 header

javascript - Chrome 扩展程序 : Replacing Favicons

javascript - 使用 HTML5 和 Canvas 元素再现 Photoshop 的选取框工具

JavaScript匿名函数参数及调用安排

php - array_walk 抛出警告;声明无效可调用