function debounce(func, wait) {
var timeout;
return function () {
clearTimeout(timeout)
timeout = setTimeout(func, wait);
}
}
debounce函数里为什么要加return function(){ } ? 去掉会怎样?
function debounce(func, wait) {
var timeout;
return function () {
clearTimeout(timeout)
timeout = setTimeout(func, wait);
}
}
debounce函数里为什么要加return function(){ } ? 去掉会怎样?
首先,有一个概念:
闭包:闭包的作用有两个:1.是有权访问另一个函数中变量的函数(也是定义)
2.可以把函数当做变量返回
作用域链:作用域链的访问是:从最内部访问到全局作用域,内部能访问他之外的,反之不可
so 你这里如果不return function,外部无法访问这个作用域了,你var的timeout就得不到经过function的值,每次调用debounce这个函数都重新声明了一个全新的timeout.
debounce本来就要返一个包裹函数,你以后的每次调用,其实调用的都是包裹函数,并不是原函数
function fetchData(){
//some code
}
//debounceFetchData并不是fetchData,而是返回的一个匿名函数,里面包裹了原函数:fetchData
var debounceFetchData=debounce(fetchData,1000);
//每一次调用都会生成一个定时器
//如果上一次的定时器还没有执行,则会被清除
//如此就达到了防抖动的目的
debouceFetchData();
我想回答一个很欠抽的答案:
这就是 JS「防抖、节流」的简单实现方案呀,
可以去了解一下 JS「防抖、节流」的各种实现方案以及原理,
说白了,这就是 JS 的基本功。
「楼主看了不要骂我」
10 回答11.2k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
我猜是为了清掉计时器的原因
如果去掉
return function
的话每次调用debounce
这个函数都重新声明了一个全新的timeout
,所有clearTimeout
清掉的是一个没有赋值的全新的timeout
,导致每次调用都启动一个setTimeout
但是清不掉