闭包
一.闭包原理
**闭包原理:**指有权访问另一个函数作用域当中变量的函数,创建闭包常见的就是在函数中创建另一个函数,创建的函数可以访问当前函数中的局部变量。
我自己的理解:
在函数外部能访问到函数内部的值,在函数中创建另一个函数,并且返回这个创建好的函数,把这个初始函数赋值给一个变量,这个变量接收到的就是一个匿名函数,匿名函数的this又是指向全局对象的,当你把这个匿名函数给这个变量时,this就指向了这个变量,就能创建私有变量,且不会被垃圾回收。缺点:使用过度闭包会消耗内存,造成内存泄漏,当我们使用完闭包后,应该将引用变量滞空。
闭包用途:
1.在函数外部能够访问到函数内部的变量,通过闭包,在外面调用闭包函数,从而在外部访问到函数内部的变量,以此来创建私有变量
2.在已经运行结束的函数上下文中的变量继续留着内存中,因为闭包函数保留了这个变量对象的引用,所以变量对象不会被回收。
列子:
在页面中,有三个按钮,你点击那个按钮就返回按钮的值,寻常使用var来进行声明遍历,var声明的是全局变量,使用var的话就需要使用闭包来实现功能:
第二种就是使用let进行声明变量,let自带块级作用域。
2.防抖
原理:在事件被触发n秒后执行回调,如果在这n秒内事件又被触发,则重新计时。
我自己的理解:事件点击一次触发回调,多次点击,则会重新记时在触发
用途:在一些请求事件上,避免用户多次点击向后台发送请求。
源码解析:
使用情况:
防抖Js 手写
3.节流
原理:在规定的单位时间内,只能有一次触发事件的回调函数执行,如果在同一个时间内被触发多次,只会生效一次。
我自己的理解:在规定的时间内,多次触发,只会触发一次结果
用途:用在scroll函数的事件监听上,通过事件节流来降低事件调用频率
代码原理:时间戳版:第一个参数:需要被触发的函数本身,第二个参数:在这个时间段只能触发一次,定义一个空时间,根据时间戳,去获取当前时间,并把当前时间赋值给这个空时间变量,为的是记录第一次点击的时间,先判断在把时间赋值给空时间,当前时间减去初始时间大于所定义的时间时,才能触发fn函数。
使用场景:
1.时间戳版:
2.定时器版