关于return function()的一点疑问

function debounce(func, wait) {
    var timeout;
    return function () {
        clearTimeout(timeout)
        timeout = setTimeout(func, wait);
    }
}

debounce函数里为什么要加return function(){ } ? 去掉会怎样?

阅读 6.5k
6 个回答

我猜是为了清掉计时器的原因
如果去掉return function的话每次调用debounce这个函数都重新声明了一个全新的timeout,所有clearTimeout清掉的是一个没有赋值的全新的timeout,导致每次调用都启动一个setTimeout但是清不掉

使用了闭包,这样防抖函数就不用在外部显式地维护计时器ID,提高了函数的内聚性

首先,有一个概念:

闭包:闭包的作用有两个:1.是有权访问另一个函数中变量的函数(也是定义)
                      2.可以把函数当做变量返回
作用域链:作用域链的访问是:从最内部访问到全局作用域,内部能访问他之外的,反之不可      
so 你这里如果不return function,外部无法访问这个作用域了,你var的timeout就得不到经过function的值,每次调用debounce这个函数都重新声明了一个全新的timeout.
                        

debounce本来就要返一个包裹函数,你以后的每次调用,其实调用的都是包裹函数,并不是原函数

function fetchData(){
    //some code
}

//debounceFetchData并不是fetchData,而是返回的一个匿名函数,里面包裹了原函数:fetchData
var debounceFetchData=debounce(fetchData,1000);

//每一次调用都会生成一个定时器
//如果上一次的定时器还没有执行,则会被清除
//如此就达到了防抖动的目的
debouceFetchData();

为了clearTag 能访问到又不想创建变量 如果需要多个这种类型的你需要创建多个Tag

我想回答一个很欠抽的答案:
这就是 JS「防抖、节流」的简单实现方案呀,
可以去了解一下 JS「防抖、节流」的各种实现方案以及原理,
说白了,这就是 JS 的基本功。

「楼主看了不要骂我」

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题