闭包

2021-02-27  本文已影响0人  依然还是或者其他

基本概念:

它由两部分组成。执行上下文(代号A),以及在该执行上下文中创建的函数(代号B)。
当B执行时,如果访问了A中变量对象中的值,那么闭包就会产生。

红宝书中的解释是:
指有权访问另一个函数作用域中变量的函数,即指的是B。
但在chrome中的closure指的是A。

但其实主要的是闭包是有A和B构成的,两者只是在称呼上有所区别。

原理

在调用一个函数时,会为这个函数创建一个执行上下文,并创建一个作用域链。
外部函数的活动对象是内部函数的作用域链上的第二个活动对象,向外延伸,直至全局执行上下文。
函数执行完毕后,局部活动对象会被销毁。
但闭包不同,内部函数会把其包含的外部活动对象添加到自己的作用域链中,所以当外部函数执行完成后,其执行上下文的作用域会被销毁,但被内部函数引用的活动对象然后会被保留。
除非内部函数被销毁了,其引用的活动对象才会被销毁。

这也就形成了闭包。

场景

闭包的场景随处可见,ajax的回调,事件的回调,定时器,或者一个函数内部返回一个另一个匿名函数等等

作用

通过闭包,在其他的执行上下文中,访问到函数的内部变量。

优点:

缺点:
但过度使用闭包会有内存溢出的风险,这是因为B作用域内的引用了A作用域中的变量,导致A执行完后,不能清除作用域,保持了对内存的占用。所以过度使用,是存在风险的。


参考
《JavaScript高级程序设计》
前端基础进阶(五):闭包
JavaScript中闭包的概念、原理、作用及应用
当面试官问你闭包时,他究竟想听到些什么?
Javascript 闭包并非魔法

上一篇 下一篇

猜你喜欢

热点阅读