手写函数防抖
防抖的定义:
事件响应函数在一段时间后才执行,如果在这段事件内再次调用函数,则重新计算执行时间
不防抖的危害:
- 发送过多的请求,服务器瘫痪
 - 影响性能,出现卡顿
 
防抖的应用场景:
- scroll 事件滚动触发
 - 搜索框输入查询
 - 表单验证
 - 按钮提交事件
 - 浏览器窗口缩放,resize事件
 
Underscore
一个JavaScript实用库,提供了一整套函数式编程的实用功能,里边有防抖函数,就是这个哥们_.debounce
<div id="contant"></div>
<button id="btn">取消防抖</button>
<script src="https://cdn.bootcss.com/underscore.js/1.9.1/underscore.js"></script>
<script>
  let count = 0;
  const contant = document.querySelector("#contant");
  function doSomeThing(){
    //可能会做回调函数或者ajax请求
    contant.innerHTML = count++;
  }
  // 高阶函数 防抖
  contant.onmousemove = _.debounce(doSomeThing,1000,false); //第三个参数=>是否立即执行 默认为false
  // 事件响应函数在一段时间后才执行,如果在这段事件内再次调用,则重新计算执行时间
  // 当预定的时间内没有再次调用该函数,则执行doSomeThing
</script>
既然都有现成的了,为啥还要手写防抖函数呢,因为underscore不仅仅包含了防抖函数,还有许多其他的方法,大小有6.5KB(生产版)
如果只是需要underscore里的debounce防抖函数就引用underscore是不是很浪费,所以直接手写一个debounce函数,代码也不多啦
function debounce(func, wait, immediate){
    let timeout;
    let result;
    let debounced =  function(){
        let context = this;   
        let args = arguments; //event指向
        if(timeout) clearTimeout(timeout);
        if(immediate){
            let callNow = !timeout;
            timeout = setTimeout(()=>{
                timeout = null;
            },wait)
            // 立即执行
            if(callNow) result = func.apply(context, args);
        }else{
            // 不会立即执行
            timeout = setTimeout(function(){
                result = func.apply(context, args);
            }, wait)
        }
        return result;
    }
    debounced.cancel = function() {
        clearTimeout(timeout);
        timeout = null;
    }
    return debounced;
}
//=====================以上是防抖函数=====================
let count = 0;
const contant = document.querySelector("#contant");
const btn = document.querySelector("#btn");
function doSomeThing(e){
    // event指向问题
    console.log(e);
    // 改变执行函数的this指向问题
    console.log(this);
    // 可能会做回调函数或者ajax请求
    contant.innerHTML = count++;
    // 有return的时候
    return 123;
}
let doSome = debounce(doSomeThing, 10000)
// 取消防抖
// 万一事件函数执行着,执行着,你不想执行了,10s好漫长,不执行也罢,可以取消防抖哦
btn.onclick = function() {
    doSome.cancel();
}
// 高阶函数 防抖
contant.onmousemove = doSome;
当然也可以找到underscore的源码,ctrl+c ctrl+v,但是,手敲一遍,会让你醍醐灌顶,不禁发出 哦~~,原来是这样
                    
                
                
            
        
浙公网安备 33010602011771号