节流和防抖经常在面试中被问到,也很容易搞混,这里就记录下节流和防抖函数的实现
1. 节流
只在开始执行一次,未执行完成过程中触发的忽略,核心在于开关锁????。
例如:多次点击按钮提交表单,第一次有效
// 节流function throttle(fn, delay) {var timer = null;return function () {if (timer) { return false;}var that = this;var args = arguments; fn.apply(that, args); timer = setTimeout(function () {clearTimeout(timer); timer = null; }, delay || 500); }; }// 使用function clickHandler() {console.log('节流click!'); }const handler = throttle(clickHandler);document.getElementById('button').addEventListener('click', handler);复制代码
2. 防抖
只执行最后一个被触发的,清除之前的异步任务,核心在于清零。
例如:页面滚动处理事件,最后一次有效
// 防抖function debounce(fn, delay) {var timer = null;return function () {var that = this;var args = arguments;clearTimeout(timer);// 清除重新计时timer = setTimeout(function () { fn.apply(that, args); }, delay || 500); }; }// 使用function clickHandler() {console.log('防抖click!'); }const handler = debounce(clickHandler);document.getElementById('button').addEventListener('click', handler);复制代码
关于容易搞混的问题,就记住:节流第一次有效,防抖反之