闭包的认识

1.什么是闭包?

闭包的形成首先是在函数里,简单的理解就是函数里面嵌套的一个函数,里面的函数可以访问到外层函数里面的的局部变量,并将里面的函数return出去,这样就形成了

2.闭包的构成:

(1)函数

(2)创建该函数的环境

3.闭包的特点:

(1)可以读取自身函数外部的变量(就是沿着作用域链寻找)先从自身开始查找,如果自身没有才会继续往上级查找,自身如果拥有将直接调用,那个离得近就先用谁的

(2)必须有函数的嵌套,就比如说b是嵌套在函数a的里面的

(3)延长内部变量的生命周期

(4)a函数可以return函数b

4.闭包的作用:

(1) 可以读取函数内部的变量
(2) 可以把变量始终保存在内存中

  可能有人会问为什么会保存在内存中呢?

因为在作用域链中是当这个函数在执行完后,就会制动释放,会被回收机制收走,但是在闭包里面就不一样了,在我们的最外层的函数执行完并返回后,回收机制不会把垃圾回收,因为内部函数还会依赖外层函数中的变量,所以不会被收走。(这里我不充一点,回收机制的定义是什么:被回收的垃圾,是在整个作用域当中以及完成它所有的使命,和任何函数都没有关联了,这才会被回收机制回收)

5.所以上面这个闭包不会释放内存,就会导致一个问题?

就是会造成作用域链的内存溢出,溢出就是我们的内存空间越来越少了,还有一种可能就是代码出问题了。

6闭包运行的原理

闭包的认识_第1张图片

我们在这里就简单的介绍一下

首先一来就会创建一个ecs环境栈,简单理解就是存放函数的地方,栈的特点我们就不多说了(它是先进后出的),栈里面第一个存放的是mian()的函数,我们的函数在执行前都会有一个预编译就是Windows(GO)下面的,我们可以找到outer这个函数和getNum这个函数和i,又因为它们是一个函数体,所以又要重新开辟一块新的空间我用箭头标上了,此时我们的outer函数scope是指向GO的,当我们执行outer函数时outer就会创建一个AO活动对象里面就只有一个i,此时outerAO的属性parent是指向GO的,此时getNum的scope是指向outerAO的,此时就形成了一个闭包的环境,当outer函数执行完以后,此时的outer函数就出栈了,随之outer函数到outerAO的应用箭头就消失,由此可见outer的AO还是和GO和getNum函数有联系,所以会继续栈用内存,当执行到第一个getNum函数时,也会创建一个getNumAO里面是空的,就会依次往下找,找到outerAO看里面有没有,有的话就输出,后面的跟前面的一样。

6.闭包的缺点

因为闭包的变量保存在内存中,内存泄漏,对内存的消耗很大,所以不要滥用闭包

7.闭包常用的地方:
    (1) es5 for循环事件监听
    (2)函数里使用了定时器
    (3)封装许多高级的功能集

你可能感兴趣的:(闭包的认识)