对于闭包的理解

在学习JS的过程中,难免听到一个词,闭包。

闭包这个词听起来就晦涩,有点不知所云,不像循环语句,条件语句那样顾名思义。

于是我上网查了一些相关资料,网络上的理解整理如下:

由于在JS函数的内部可以访问到外部的全局变量,而外部却无法访问函数内部声明的变量,

因为JS的函数具有局部作用域,会销毁声明的变量。

为了解决这个问题,使用函数中嵌套循环的方式,将结构分为外部,一层函数,二层函数。

由一层函数嵌套二层函数后,将二层函数整体return给一层函数后,就可以在外部获取函数内部的变量,达到延长变量声明周期的效果。

嗯~当时这么一看好像还是蛮清楚的,可以理解,问题不大,也没有好好研究当时给出的代码案例

直到最近开始研究防抖和节流的时候才意识到问题的严重性,对于闭包知识点掌握的不牢固

导致我看不懂解释的代码,也是研究了很久才终于摸清楚闭包到底咋回事

在这个博客当中记录一下,以免后期遗忘。

先放一下帮助我搞清楚的代码

1: function createCounter() {
2:   let counter = 0
3:   const myFunction = function() {
4:     counter = counter + 1
5:     return counter
6:   }
7:   return myFunction
8: }
9: const increment = createCounter()
10: const c1 = increment()
11: const c2 = increment()
12: const c3 = increment()
13: console.log('example increment', c1, c2, c3)

在这段代码中,会发现出现了函数套函数的情况,并且在7行的时候将整个函数myFunction

return给了createCounter

注意,这里是重点,要搞清楚返回了一个什么东西

return myFunction

return myFunction()

上面这两个代码有什么不同??返回给createCounter的分别是什么

说结论 :

··下面的代码返回的是myFunction的返回值,也就是说每次调用createCounter函数,都会得到myFunction运行后的值

··而上面的代码则是返回整个myFunction的定义和一个闭包,闭包其实是作为定义的一部分,其中包含了需要我们延长生命周期的变量。在这种情况下,我们每次调用createCounter,都会得到这个闭包当中的变量和函数相关的定义。

现在再来重新看一下这个函数代码段

1: function createCounter() {
2:   let counter = 0
3:   const myFunction = function() {
4:     counter = counter + 1
5:     return counter
6:   }
7:   return myFunction
8: }
9: const increment = createCounter()
10: const c1 = increment()
11: const c2 = increment()
12: const c3 = increment()
13: console.log('example increment', c1, c2, c3)

这个代码段的输出值是1,2,3 来分析一下内部的流程,即可理解闭包的理念

在10-12行中,我们调用了三次increment(),

increment是被赋予了createCounter函数的变量

而createCounter是被返回了内部函数定义(说白了就是变量加一)和闭包(变量counter=0的函数

所以10行c1第一次调用increment() ,由于定义是变量counter加一,所以代码去找变量counter

发现闭包中存在counter=0 运行变量加一之后 counter=1 并返回给c1

注意:在返回给c1之前,我们是不是得到了新的变量counter=1 

值得说明的是,他将再次被储存在闭包中,将值更新为1,为后续再次调用埋伏笔

相信说到这里也应该清楚了,在闭包的作用下,第2行的初始值定义好像在后续的重复调用中已经失去作用了,c2的counter会从c1的counter开始算,以此类推,这正是闭包带来的结果。

从开始的理解上看,本应该被无限初始化为0的这个counter变量确实因为闭包而产生了无限的生命力,并且可以再函数外部获取访问。

对于闭包终于有了比较清晰的认识,不枉花了一晚上看案例撞墙~

不过闭包也不可以随意多次使用,不然的话会导致严重的内存泄露

既然在规则中说清楚了,函数中的变量在函数结束时被销毁,那他就有存在的道理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值