导读
大家在学习完javaScript基础后,可能会对经常看见一个概念----“闭包”,闭包其实不是什么高深的概念,其实在其他很多的语言中都会有类似于这个闭包的概念,比如java中封装类的概念。接下来我浅聊一下我对于闭包的理解
正文
一、概念:
闭包的概念简单来说就是函数嵌套函数,其內部函数和外部函数定义的变量共同构成的部分,我们就可以说是闭包。
二、闭包的特性:
在正常的情况下,函数的内部变量会在函数被调用时开始创建,并在函数执行完毕以后,被销毁掉(释放内存空间),但是闭包的话,当内部函数还没有执行完成时,外部函数的变量不会被销毁
三、闭包的应用场景
基于上面我们聊到的闭包特性,我们可以拓展下自己的思维。其实呢闭包的使用场景就是想让数据私有化。在有些特别场景下,大家协同开发时,因为大家都可以访问到定义在全局的变量,所以对于全局变量而言是很容易被修改的。而在使用闭包后,这个问题就迎刃而解了,外部依然可以访问这个变量,但是没有办法修改它的值,从而实现数据的私有化,大家可以结合这段代码,来思考这个问题
function fn() {
let count = 1
function fun() {
count++
console.log(`函数被调用了${count}次`)
}
return fun
}
const result = fn()
result() //2
result() //3
四、闭包可能会内存泄露
我们所说的闭包不是一定就会引起内存的泄露问题,这不是绝对的。它只是可能会引起内存泄露。比如你在定义一个闭包时根本就没有return暴露出去,就自然不会出现泄露。当然如果外部定义了一个全局变量,并且在外部调用了闭包时,这时就会出现内存的泄露问题
譬如在这儿,我们定义的全局变量result,因为全局变量不会像局部变量一样销毁(内存释放),所以这里的这个全局变量会连续传导使得变量count出现内存泄露的问题。
总结
闭包是指函数能够访问并使用其词法作用域外部的变量的能力。它利用了函数在定义时所处的作用域,并可以保护变量不受外部干扰。闭包还具有记忆效应,可以记住函数定义时所处的作用域,使得函数在之后的调用中可以使用之前定义的变量和状态。同时,闭包也可以用来实现延迟执行的效果