防抖返回值版本:
一般应用场景:按钮提交,搜索框联想
functiondebouncereturn(func, wait, immediate) {
// 创建一个标记用来存放定时器的返回值,和函数的返回值
let timeout, result;
return function () {
const context = this; const args = arguments;
// 每次当触发的时候,把前一个定时器清除
if (timeout) clearTimeout(timeout); // 然后设置一个新的定时器,
//immediate为true时候有返回值
if (immediate) { const callnow = !timeout; timeout = setTimeout(() => { timeout = null; }, wait); //第一次触发的时候立即执行
if (callnow) result = func.apply(context, args); } //immediate为flase时候没有返回值
else { timeout = setTimeout(() => { func.apply(context, args); }, wait); } return result; } }
节流—定时器版本
一般应用场景:鼠标滚动,拖拽场景,缩放场景
// 当触发事件的时候,我们设置一个定时器,再触发事件的时候, // 如果定时器存在,就不执行,直到定时器执行,然后执行函数,清空定时器,这样就可以设置下个定时器。
function throttle(func, wait) {
let timeout;
return function () {
const context = this;
const args = arguments;
if (!timeout) {
timeout = setTimeout(() => {
timeout = null;
func.apply(context, arguments); }, wait);
} } }