liangjh518

难度: 中等

一:闭包概念

闭包是再一个函数中定义的函数,并且可以访问再夫函数作用域中声明和定义的变量。

闭包可以访问三个作用域中的变量:

  1.在自己作用域中声明的变量

  2.在夫函数中声明的变量

  3.再全局作用域中声明的变量

常见例子: 函数防抖 || 函数节流

二:例子说明

  1.函数防抖

    概念: 在事件被触发n秒后在执行回调,如果在这n秒内又被触发,则重新计时。

      使用场景: 1).给按钮加函数防止表单多次提交

          2).判断scroll是否滑到底部,滚动事件+函数防抖

     总的来说,适合多次事件一次响应的情况

    

function debounce(fn, wait) {
    var timer = null;
    return function() {
        var context = this
        var args = arguments
        if(timer) {
            clearTimeout(timer);
            timer = null;
        }
        timer = setTimeout(function () {
            fn.apply(context, args)
        }, wait)
    }
}
var fn = function() {
    console.log(\'boom\')
}
setInterval(debounce(fn, 500), 1000) //第一次再1500ms之后触发,之后每1000ms触发一次

 

  2.函数节流

    概念:规定一个单位时间,在这个单位时间内,只能有一次触发时间的回调函数执行,如果在同一个单位时间内某件事被触发多次,只能有一次生效。

      使用场景:

      1).游戏中的刷新率

      2).DOM元素拖拽

      适合大量事件按时间做平均分配触发

function throttle(fn, gapTime) {
    let _lastTime = null;
    return function() {
        let _nowTime  =+ new Date()
        if (_nowTime - _lastTime > gapTime || !_lastTime) {
            fn();
            _lastTime = _nowTime
        }
    }
}
let fn = () => {
    console.log(\'boom\')
}
setInterval(throttle(fn, 1000), 10)

函数防抖和函数节流都是控制函数的执行次数。

如果有不正确之处,希望多多指正,谢谢

 

分类:

技术点:

相关文章: