什么是闭包?

MDN:闭包(closure)是一个函数以及其捆绑的周边环境状态(lexical environment,词法环境)的引用的组合。换而言之,闭包让开发者可以从内部函数访问外部函数的作用域。在 JavaScript 中,闭包会随着函数的创建而被同时创建;
闭包是由函数以及声明该函数的词法环境组合而成的。该环境包含了这个闭包创建时作用域内的任何局部变量;
简单来说:就是函数嵌套使用,内部函数需要访问外部函数的变量,若内部函数始终存在于内存中,由于内部函数变量依赖于外部函数的原因,就会使得外部函数的数据不会被垃圾回收机制回收。

闭包的生成有三个必要条件?

1.函数嵌套
2.内部函数引用了外部函数的属性或函数
3.参数和变量不会被回收
待定条件:外部函数return内部函数

创建闭包最常见方式,就是在一个函数内部创建另一个函数:

function f1() {var n = 999;nAdd = function () { n += 1 }function f2() {console.log(n);}return f2;
}
var result = f1();
result(); // 999
nAdd();
result(); // 1000

f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。

什么是闭包?闭包形成的必要条件?相关推荐

  1. [转][Python小记] 通俗的理解闭包 闭包能帮我们做什么?

    热身 首先给出闭包函数的必要条件: 闭包函数必须返回一个函数对象 闭包函数返回的那个函数必须引用外部变量(一般不能是全局变量),而返回的那个函数内部不一定要return 几个典型的闭包例子: # EN ...

  2. 函数作为返回值练习 作用域和作用域链及预解析 闭包 闭包小案例

    函数作为返回值练习 <!DOCTYPE html> <html lang="en"> <head><meta charset=" ...

  3. 闭包--闭包作用之保护(一)

    闭包作用:保护 形成私有作用域,保护里面的私有变量不受外界干扰 例如多人协作开发:A的代码有fn(),B的代码有fn(),但是他们不相互影响 // A的代码<script>(functio ...

  4. 32.Python面向对象(五)【描述符、运算符底层、装饰器:闭包-闭包参数-内置装饰器-类装饰器】

    目录: 每篇前言: Python面向对象(五) 1.1 描述符 1.2 运算符底层调用的什么? 1.3 装饰器 第一部分--引入门 (1)首先.咱再看遍闭包是啥: (2)然后,咱稍微高级点,看看闭包参 ...

  5. 作用域和闭包(闭包)

    闭包可以看做是把函数的词法作用域保存下来,以供在其他外部调用时能够做到访问权限的控制.参考如下代码: var fn; function foo() { var a = 2; function baz( ...

  6. python闭包函数的必要条件_Python 函数 functions、闭包 closure

    一般我们都知道,函数只有在调用的时候才会被执行 但是我们在用 def 定义一个函数时,编译器做了什么?或者什么都没做? 实际上,当用 def 定义一个函数时,就创建了一个函数对象,该对象封装了函数体, ...

  7. 函数——IIFE、作用域、函数调用、函数应用、闭包

    IIFE 立即调用的函数表达式 IIFE的作用: 1.页面加载完成后只执行一次的设置函数 2.将设置函数中的变量包裹在局部作用域中,不会泄露全局变量 先来看一下不采用IIFE时的函数声明和函数调用: ...

  8. 函数小知识点(文档字符串,闭包等)

    1 文档字符串(Documentation Strings) 一般被称为docstring,一款你应当使用的重要工具,它能够帮助你更好地记录程序并让其更加易于理解.令人惊叹的是,当程序实际运行时,我们 ...

  9. 读javascript高级程序设计03-函数表达式、闭包、私有变量

    一.函数声明和函数表达式 定义函数有两种方式:函数声明和函数表达式.它们之间一个重要的区别是函数提升. 1.函数声明会进行函数提升,所以函数调用在函数声明之前也不会报错: test(); functi ...

  10. 一个考查作用域以及闭包的题目

    var a = 2; var func = (function(){ var a = 3; return function(){a++;console.log(a); } })(); func(); ...

最新文章

  1. 【转】局域网内访问VS2012 调试的IIS Express web服务器
  2. 《Fabric 云存储的电子健康病历系统》(1)系统介绍
  3. 2020-11-8(activity状态以及任务栈)
  4. android 自定义表单,Android实现Ant Design 自定义表单组件
  5. 中国人寿构建国内首个Silverlight企业级应用
  6. 386bsd 0.0
  7. CT一般扫描参数_CT图像质量参数
  8. ios8升级ios12教程_iOS SpriteKit教程
  9. Rust: 如何与DLL文件进行交互?
  10. 清华大学计算机音乐,校长杯十强故事汇 || DeepMusic:音乐也能如此“深邃”
  11. (三)进程各种id:pid、pgid、sid、全局pid、局部pid
  12. 服务发现框架 —————— 开开开山怪
  13. Java 求阴历(C++ 求阴历方法的转换)
  14. Discuz仿魔客吧模板/素材资源站模板/包含DIY文件
  15. bzoj4008亚瑟王
  16. 为什么我的背景图片加载不出来
  17. Win32 API 概论
  18. 完整iOS APP发布App Store上架流程指南
  19. 关于安卓上pcm文件转wav全是噪音解决办法
  20. FFmpeg分离(解封装)视频和音频

热门文章

  1. Python 3.10 和 Python 3.9 之间的差异
  2. 今天来干一件大事,安装微软正版WINPE.
  3. 计算机专业如何践行工匠精神论文2000,工匠精神论文2000字范文.doc
  4. 抖音批量取消喜欢的方法
  5. 海思3516D闪屏问题-修复
  6. 斐波那契数列(递归和非递归算法)
  7. 两个Harbor镜像库之间备份拉取镜像的shell脚本
  8. 基于WPS实现Excel表的二级下拉选择框
  9. MySQL时区错误处理方法
  10. ibdata1文件过大问题