一.什么是闭包(闭包的原理)
闭包的形成与变量的作用域以及变量的生存周期密切相关,变量的作用域,就是指变量的有效范围。
生存周期对于全局变量是永久的,除非我们主动销毁这个全局变量,而对于在函数内用 var 关键字声明的局
部变量来说,当退出函数时,它们都会随着函数调用的结束而被销毁
总结:全局变量一直存在,少用,函数内部的变量用完即销毁,可以用。
闭包就是能够读取其他函数内部变量的函数。由于在Javascript语言中,只有函数内部的子函数才能读取局部
变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。
二.闭包的特点
1.函数嵌套函数;
2.内部函数使用外部函数的参数和变量;
3.函数参数和变量不会被垃圾回收机制回收,闭包可以使得它诞生环境一直存在。
三.闭包的优缺点
1.闭包的好处:
希望一个变量长期存储在内存中(延长变量作用域)。
避免全局的污染,私有成员(函数内部的变量)的存在。
2.闭包的缺点:
闭包使得内部的变量一直存在,变量常驻内存,增加内存使用量--手动销毁,设为null
使用不当会造成内存泄漏
内存泄露是指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束。
当变量标记为离开环境或者变量引用计数为0,而垃圾回收机制无法回收时,就会产生内存泄漏
四.函数的防抖和节流
函数防抖:当事件被触发一段时间后再执行回调,如果在这段时间内事件又被触发,则重新计时。
在事件触发时,开始计时,在规定的时间(delay)内,若再次触发事件,将上一次计时(timer)清空,然后重
新开始计时。保证只有在规定时间内没有再次触发事件之后,再去执行这个事件。
生活中的实例: 如果有人进电梯(触发事件),那电梯将在10秒钟后出发(执行事件监听器),这时如果又有
人进电梯了(在10秒内再次触发该事件),我们又得等10秒再出发(重新计时)。
function debounce(fn, delay) {
var timer = null
return function () {
clearTimeout(timer)
setTimeout = (() => {
fn()
}, delay)
}
}
2.函数节流(throttle)
函数节流(throttle):指定时间间隔内,若事件被多次触发,只会执行一次
在事件触发之后,开始计时,在规定的时间(delay)内,若再次触发事件,不对此事件做任何处理。保证在规
定时间内只执行一次事件.
生活中的实例: 当 1 秒内连续播放 24 张以上的图片时,在人眼的视觉中就会形成一个连贯的动画,所以在电影
的播放中基本是以每秒 24 张的速度播放的,为什么不 100 张或更多是因为 24 张就可以满足人类视觉需求的时
候,100 张就会显得很浪费资源。
function throttle(fn,delay){
var timer=null
return function(){
if(timer){
return
}
setTimeout(()=>{
fn()
timer=null
},delay)
}
}
五.promise(承诺)
Promise 可以解决回调地狱的问题。
Promise 异步编程的一种解决方案,比传统的解决方案(回调函数)更合理和更强大。
Promise 对象代表一个异步操作,有三种状态:pending进行中、fulfilled成功、rejected失败。
Promise对象有以下两个特点。
(1)对象的状态不受外界影响
(2)一旦状态设定,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可
能:从pending变为fulfilled和从pending变为rejected,只要这两种情况发生,状态就凝固了
promise原型下面三个常用的方法:
Promise.prototype.then Promise.prototype.catch Promise.prototype.finally
resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操
作成功时调用,并将异步操作的结果,作为参数传递出去;
reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作
失败时调用,并将异步操作报出的错误,作为参数传递出去。
finally方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。
标签:闭包,触发,函数,Promise,事件,promis,变量 From: https://www.cnblogs.com/ld1936805253/p/16829780.htmlpromise对象下面二个静态方法:
Promise.all():用于将多个 Promise 实例,包装成一个新的 Promise 实例,接受一个数组作为参数,只有数组
里面的每个状态都变成resolve,则新的 Promise 实例状态才会变成resolve.
Promise.race():方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例,接受一个数组作为参
数,只要其中有一个实例率先改变状态,则整个的状态就跟着改变。