闭包

基本概念:

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

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

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

原理

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

这也就形成了闭包。

场景

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

作用

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

优点:

  • 形成私有变量,形成封装
  • 模块化开发,防止全局污染。
  • 用于缓存,因为保持了对变量的持久引用

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


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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、闭包的定义 闭包是指有权访问另一个函数作用域中的变量的函数 --《JavaScript高级程序设计》 函数对象...
    沐向阅读 426评论 0 0
  • 什么是闭包? 闭包是指那些能够访问自由变量的函数。自由变量:指在函数中使用的,但既不是函数参数也不是函数的局部变量...
    BubbleM阅读 404评论 0 1
  • 前言 面试问题: 说一下对变量提升的理解 说明this的几种不同的使用场景 创建10个 标签,点击的时候弹出来对应...
    陈观齐阅读 349评论 0 1
  • 在前端开发中闭包是一个很重要的知识点,是面试中一定会被问到的内容。之前我对闭包的理解主要是"通过闭包可以在函数外部...
    CodeMT阅读 275评论 0 0
  • 夜莺2517阅读 128,497评论 1 9

友情链接更多精彩内容