闭包
2021-02-27 本文已影响0人
依然还是或者其他
基本概念:
它由两部分组成。执行上下文(代号A),以及在该执行上下文中创建的函数(代号B)。
当B执行时,如果访问了A中变量对象中的值,那么闭包就会产生。
红宝书中的解释是:
指有权访问另一个函数作用域中变量的函数,即指的是B。
但在chrome中的closure指的是A。
但其实主要的是闭包是有A和B构成的,两者只是在称呼上有所区别。
原理
在调用一个函数时,会为这个函数创建一个执行上下文,并创建一个作用域链。
外部函数的活动对象是内部函数的作用域链上的第二个活动对象,向外延伸,直至全局执行上下文。
函数执行完毕后,局部活动对象会被销毁。
但闭包不同,内部函数会把其包含的外部活动对象添加到自己的作用域链中,所以当外部函数执行完成后,其执行上下文的作用域会被销毁,但被内部函数引用的活动对象然后会被保留。
除非内部函数被销毁了,其引用的活动对象才会被销毁。
这也就形成了闭包。
场景
闭包的场景随处可见,ajax的回调,事件的回调,定时器,或者一个函数内部返回一个另一个匿名函数等等
作用
通过闭包,在其他的执行上下文中,访问到函数的内部变量。
优点:
- 形成私有变量,形成封装
- 模块化开发,防止全局污染。
- 用于缓存,因为保持了对变量的持久引用
缺点:
但过度使用闭包会有内存溢出的风险,这是因为B作用域内的引用了A作用域中的变量,导致A执行完后,不能清除作用域,保持了对内存的占用。所以过度使用,是存在风险的。
参考
《JavaScript高级程序设计》
前端基础进阶(五):闭包
JavaScript中闭包的概念、原理、作用及应用
当面试官问你闭包时,他究竟想听到些什么?
Javascript 闭包并非魔法