简易理解闭包

本文将讨论闭包,闭包结构的区别,好让读者简易了解和应用闭包

什么是闭包和闭包结构?

百度百科的解释:https://baike.baidu.com/item/闭包/10908873?fr=aladdin闭包是一个能访问其他函数内部变量的函数,下面例子,赋值号右边是一个匿名函数,而这个匿名函数里面又是返回一个匿名函数,我们将这种内层函数被外层函数包裹着(return 回来的是内层函数)的结构视为可形成闭包结构。为什么说可形成而不直接是闭包呢,闭包结构顾名思义是一个闭环像包子的结构,因为它还没有形成一个闭环,也就是还没形成闭包结构。

  var outer=function(){
            var i=1;
            return function(){
                console.log(i++)
            }
        }
        console.log(outer);
        console.log(outer())
        var a=outer();//形成闭包结构
        a();
        

在这里插入图片描述
那重点是什么时候形成闭包结构呢?我们先将上述代码输出一下,可以看到outer就是一个保存了右边函数对象地址的变量,当我们调用函数outer的时候,输出的结果是内层函数,就是return回来的内容,一个函数的结果是他的返回值,这也符合正常结果。这时候要注意了,因为闭包的样子和这个内层函数一模一样,但他又不是闭包。我们把调用后的外层函数(这里指outer())赋值给变量a,到这里闭包结构就形成了,这一步至关重要,因为a保存在window对象里面,而这一步又让a指向内层函数,在调用外层函数的时候,这里是outer(),生成了内层函数作用域对象和外层函数作用域对象,内层函数作用域对象通过scope属性指向外层函数作用域对象,外层函数作用域对象通过parent指向window对象。如下图
在这里插入图片描述
在还没把调用后的外层函数赋值给变量a,就没有a指向内层函数这条线,就无法形成一个闭环结构,到这里我们可以看到一个闭环的结构,一个闭包结构已经形成。那我们似乎还没讲清楚什么是闭包。要知道现在a指向内层函数,不好理解的话,相当于以下代码:

a=function(){console.log(i++)}

当我们调用a的时候,会另外生成新的一个函数作用域对象,这个函数就是我们所说的闭包,它的parent属性指向外层函数,可以通过闭包函数去改变外层函数作用域对象里面的被保护的变量,这里是变量 i;所以最后一个输出是1;这个新的函数作用域对象和内层函数一模一样,却又不是内层函数作用域对象,所以别混淆哦!
在这里插入图片描述
希望大家看完能有所收获,还有疑问的小伙伴请留言

猜你喜欢

转载自blog.csdn.net/weixin_44494811/article/details/86776760