js中return返回函数不执行

89 阅读2分钟

外部调用一个函数,该函数return一个函数,return的函数不执行,代码如下:

//防抖
function debounce (fn, delay = 1000) {
  let time = null
  return function () {
    // 获取当前this
    let that = this
    // 判断是否已经存在,如果存在直接清除
    if (time) {
      clearTimeout(time)
    }
    time = setTimeout(() => {
      // 使fn 中this,执行当前调用者,并传入参数
      fn.apply(that, arguments);
    }, 100)
  })()
  
}

因为return的是function,外部访问的时候必须加上括号,不然得到的是function本身的内容,但不执行。如果要得到return后的函数,就是要得到debounce()(),而不是debounce(), 所以return的函数必须加上括号。 代码修改如下:

//防抖
function debounce (fn, delay = 1000) {
  let time = null
  // 因为return的是function,外部访问的时候必须加上括号,不然得到的是function本身的内容,但不执行
  return (function () {
    // 获取当前this
    let that = this
    // 判断是否已经存在,如果存在直接清除
    if (time) {
      clearTimeout(time)
    }
    time = setTimeout(() => {
      // 使fn 中this,执行当前调用者,并传入参数
      fn.apply(that, arguments);
    }, 100)
  })()
  
}

最后执行成功。

PS: 防抖在连续的事件,只需触发一次回调的场景有: 搜索框搜索输入。只需用户最后一次输入完,再发送请求 手机号、邮箱验证输入检测 窗口大小resize。只需窗口调整完成后,计算窗口大小。防止重复渲染。

节流在间隔一段时间执行一次回调的场景有: 滚动加载,加载更多或滚到底部监听 搜索框,搜索联想功能

2.防抖函数和节流函数的区别 防抖函数是在单位时间(>1)随便触发多少次事件,只要这次触发的时间与上次触发的时间只差不到1s,都不执行;所以执行一次的时候离触发开始可能已经过了2s,3s,4s都有可能了。

节流函数是在单位时间(>1)随便触发多少次事件,只要过了1s,就会执行一次。 两个函数都能达到防止重复触发的功能。但是函数防抖是 n秒后延迟执行;而函数节流是立马执行,n秒后再立马执行。

3.具体的使用主要看需求:

当我们只需要处理最后一次触发事件时,用函数防抖 当事件触发过于频繁,我们需要限制事件处理程序的调用频率时,用函数节流