首页 > 其他分享 >闭包和promis

闭包和promis

时间:2022-10-26 19:45:45浏览次数:56  
标签:闭包 触发 函数 Promise 事件 promis 变量

一.什么是闭包(闭包的原理)

闭包的形成与变量的作用域以及变量的生存周期密切相关,变量的作用域,就是指变量的有效范围。

生存周期对于全局变量是永久的,除非我们主动销毁这个全局变量,而对于在函数内用 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对象下面二个静态方法:

Promise.all():用于将多个 Promise 实例,包装成一个新的 Promise 实例,接受一个数组作为参数,只有数组

里面的每个状态都变成resolve,则新的 Promise 实例状态才会变成resolve.

Promise.race():方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例,接受一个数组作为参

数,只要其中有一个实例率先改变状态,则整个的状态就跟着改变。

标签:闭包,触发,函数,Promise,事件,promis,变量
From: https://www.cnblogs.com/ld1936805253/p/16829780.html

相关文章