前端-闭包

闭包概念

  • 在一个函数里嵌套另一个函数,函数内部可以访问外部变量,外部函数不可操作内部变量;
  • 闭包是有权访问另一个函数作用域中变量的函数
function func(a){
	return function(){
		console.log(a);
	}
}
console.log(func('hello'));//调用外部的函数
func('hello')()//调用内部函数

闭包好处

  • 可以让一个变量长期在内存中不被释放
  • 避免全局变量的污染,和全局变量不同,闭包中的变量无法被外部使用
  • 私有成员的存在,无法被外部调用,只能直接内部调用

闭包场景

  • 隔离作用域,保护私有变量,不会被垃圾回收机制回收;
function func(){
	let i = 0
	return function(){
		i++
    	return i
	}
}
console.log(func()()); //1
console.log(func()()); //1
let a = func()
console.log(a());//1
console.log(a());//2
console.log(a());//3
  • 防抖

设置一个定时器,将很多个相同的操作合并成一个。规定在delay后触发函数,如果在此之前触发函数,则取消之前的计时重新计时,只有最后一次操作能被触发。例如:实时搜索的input,一直输入就不发送。

let input = document.querySelector("input");
let time = null;//time用来控制事件的触发
 
input.addEventListener('input',function(){
   //防抖语句,把以前的定时删除,只执行最后一次
   if(time !== null){
     clearTimeout(time);
   }
   time = setTimeout(() => {
     console.log(this.value);//业务实现语句,这里的this指向的是input
   },500)
 })
  • 节流

判断是否达到一定的时间来触发事件。某个时间段内只能触发一次函数。例如:在指定的时间内多次触发无效。

function throttle(fn, time) {//连续触发事件  规定的时间
        let flag = false;
        return function () {
            //使用标识判断是否在规定的时间内重复触发了函数,没有就触发,有就不触发
            if (!flag) {//不为假时 执行以下
                fn();//触发事件
                flag = true;//为真
                setTimeout(() => {//超时调用(在规定的时间内只执行一次)
                    flag = false;
                }, time);
            }
        }
    }
  
    mybtn.onclick = throttle(btn, 3000);//单击事件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值