我有这个debounce 功能:

const selectElement = document.querySelector('input');

const debounce = (cb, time = 1000) => {
  let timer;

  return (...args) => {
    console.log('run inner function')
    if (timer) {
      clearTimeout(timer)
    }
    timer = setTimeout(() => cb(...args), time)
  }
}

const onChange = debounce((e) => {
  console.log('event', e.target.value)
})
selectElement.addEventListener('input', onChange);
<input input={onChange}/>

代码运行良好,但我想了解返回的函数是如何在debounce函数中触发的,因为我知道如果一个函数返回另一个函数,我需要像这样调用它:debounce()()来触发第二个函数,但在我们的例子中,我们在addEventListener中只触发一次函数debounce(),但第二个调用是如何发生的?

推荐答案

或许首先承认这一点会有所帮助:

debounce()();

可以重写为

let onChange = debounce();
onChange();

你在这里的成绩是onChangeaddEventListener:

selectElement.addEventListener('input', onChange);

事件侦听器机制的内部将记住您传入的onChange,并在input事件发生时调用onChange().

设想一个function addEventListener(type, listener) {}的实现,它安排在事件发生时发生listener().

这是对defer函数调用执行的.第一部分(debounce())立即(同步)创建函数.但对debounce()返回的函数的调用将推迟到事件发生.

Javascript相关问答推荐

如何使用Echart 5.5.0创建箱形图

警告!合同执行期间遇到错误[执行已恢复](Base Layer 2)

React Code不在装载上渲染数据,但在渲染上工作

为什么这个JS模块在TypeScript中使用默认属性导入?""

如何从URL获取令牌?

v—自动完成不显示 Select 列表中的所有项目

虚拟滚动实现使向下滚动可滚动到末尾

如何解决useState错误—setSelect Image不是函数''

使用原型判断对象是否为类的实例

JavaScript是否有多个`unfined`?

Angular 形式,从DOM中删除不会删除指定索引处的内容,但会删除最后一项

使用auth.js保护API路由的Next.JS,FETCH()不起作用

AddEventListner,按键事件不工作

有没有一种直接的方法可以深度嵌套在一个JavaScript对象中?

无法检索与Puppeteer的蒸汽游戏的Bundle 包价格

AG-GRIDreact 显示布尔值而不是复选框

如何在Web项目中同步语音合成和文本 colored颜色 更改

JSX/React -如何在组件props 中循环遍历数组

Google OAuth 2.0库和跨域开放程序的问题-策略错误

2.0.0-dev quill拖动文本不起作用如何使其拖动文本