我与闭包的爱恨情仇

关于闭包的概念性解释,我查了一下感到高深有点望而却步,但是它真的很重要,卡过我的喉咙,我必须要弄懂它。总的来说闭包的解释比较拗口而且很难理解,那我们就换个角度从它要解决的问题出发去探究。

关于闭包的概念性解释,我摘抄了一部分,弄明白解决的问题了再去读一读也是好的。

  1. 闭包是基于正常的垃圾回收处理机制下的。也就是说,一般情况一个函数(函数作用域)执行完毕,里面声明的变量会全部释放,被垃圾回收器回收。但闭包利用一个技巧,让作用域里面的变量,在函数执行完之后依旧保存没有被垃圾回收处理掉。

  2. 闭包就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁

  3. 闭包:能够读取其他函数内部变量的函数。(应用场景:要获取某函数内部的局部变量)。

  4. 闭包定义:指拥有多个变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。函数内部可以直接读取全局变量。函数内部变量无法在函数外部访问。函数内部声明要用var或者let声明,不然会变成全局变量链式作用域:子对象会一级级向上寻找父对象的变量,父对象的变量子对象都是可见的,反之则不行。在一个闭包环境内修改变量值,不会影响另一个闭包中的变量。普通的函数内嵌,内部函数是先执行;而闭包则是:先把内部函数赋给外部函数,然后在执行

  5. 闭包的优点:1.能够读取函数内部的变量 2.让这些变量一直存在于内存中,不会在调用结束后,被垃圾回收机制回收,闭包的缺点:正所谓物极必反,由于闭包会使函数中的变量保存在内存中,内存消耗很大,所以不能滥用闭包,解决办法是,退出函数之前,将不使用的局部变量删除。

我们从闭包解决的问题出发:

    1. 全局范围内去访问一个函数内部的局部变量;

    2. 使变量所占用的内存不被释放;

我们知道像下面这样访问是不可以的,不能访问到里面x的值200(局部变量);

可闭包所做的事情就是取到里面局部变量的值,如何实现呢,继续看:

或许你会说增加功能,让fn1函数的作用是return x;取到x的值200;外部调用fn1可以得到函数内部局部变量的值,但是但是fn1执行完毕,变量所占的内存被释放,zhe不是闭包;

下面调用函数fn1,执行函数fn1里面的函数fn2访问到fn1里的局部变量x=200;这是闭包,但你会说我们怎么知道函数调用完变量x没有被释放呢,请继续看:

 

所以,不要纠结于闭包的概念,而是抓住它的核心去思考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值