难度: 中等
一:闭包概念
闭包是再一个函数中定义的函数,并且可以访问再夫函数作用域中声明和定义的变量。
闭包可以访问三个作用域中的变量:
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)
函数防抖和函数节流都是控制函数的执行次数。
如果有不正确之处,希望多多指正,谢谢
原文:https://www.cnblogs.com/liangjh518/p/12469811.html