什么是闭包?闭包形成的必要条件?
什么是闭包?
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)回收。
什么是闭包?闭包形成的必要条件?相关推荐
- [转][Python小记] 通俗的理解闭包 闭包能帮我们做什么?
热身 首先给出闭包函数的必要条件: 闭包函数必须返回一个函数对象 闭包函数返回的那个函数必须引用外部变量(一般不能是全局变量),而返回的那个函数内部不一定要return 几个典型的闭包例子: # EN ...
- 函数作为返回值练习 作用域和作用域链及预解析 闭包 闭包小案例
函数作为返回值练习 <!DOCTYPE html> <html lang="en"> <head><meta charset=" ...
- 闭包--闭包作用之保护(一)
闭包作用:保护 形成私有作用域,保护里面的私有变量不受外界干扰 例如多人协作开发:A的代码有fn(),B的代码有fn(),但是他们不相互影响 // A的代码<script>(functio ...
- 32.Python面向对象(五)【描述符、运算符底层、装饰器:闭包-闭包参数-内置装饰器-类装饰器】
目录: 每篇前言: Python面向对象(五) 1.1 描述符 1.2 运算符底层调用的什么? 1.3 装饰器 第一部分--引入门 (1)首先.咱再看遍闭包是啥: (2)然后,咱稍微高级点,看看闭包参 ...
- 作用域和闭包(闭包)
闭包可以看做是把函数的词法作用域保存下来,以供在其他外部调用时能够做到访问权限的控制.参考如下代码: var fn; function foo() { var a = 2; function baz( ...
- python闭包函数的必要条件_Python 函数 functions、闭包 closure
一般我们都知道,函数只有在调用的时候才会被执行 但是我们在用 def 定义一个函数时,编译器做了什么?或者什么都没做? 实际上,当用 def 定义一个函数时,就创建了一个函数对象,该对象封装了函数体, ...
- 函数——IIFE、作用域、函数调用、函数应用、闭包
IIFE 立即调用的函数表达式 IIFE的作用: 1.页面加载完成后只执行一次的设置函数 2.将设置函数中的变量包裹在局部作用域中,不会泄露全局变量 先来看一下不采用IIFE时的函数声明和函数调用: ...
- 函数小知识点(文档字符串,闭包等)
1 文档字符串(Documentation Strings) 一般被称为docstring,一款你应当使用的重要工具,它能够帮助你更好地记录程序并让其更加易于理解.令人惊叹的是,当程序实际运行时,我们 ...
- 读javascript高级程序设计03-函数表达式、闭包、私有变量
一.函数声明和函数表达式 定义函数有两种方式:函数声明和函数表达式.它们之间一个重要的区别是函数提升. 1.函数声明会进行函数提升,所以函数调用在函数声明之前也不会报错: test(); functi ...
- 一个考查作用域以及闭包的题目
var a = 2; var func = (function(){ var a = 3; return function(){a++;console.log(a); } })(); func(); ...
最新文章
- 【转】局域网内访问VS2012 调试的IIS Express web服务器
- 《Fabric 云存储的电子健康病历系统》(1)系统介绍
- 2020-11-8(activity状态以及任务栈)
- android 自定义表单,Android实现Ant Design 自定义表单组件
- 中国人寿构建国内首个Silverlight企业级应用
- 386bsd 0.0
- CT一般扫描参数_CT图像质量参数
- ios8升级ios12教程_iOS SpriteKit教程
- Rust: 如何与DLL文件进行交互?
- 清华大学计算机音乐,校长杯十强故事汇 || DeepMusic:音乐也能如此“深邃”
- (三)进程各种id:pid、pgid、sid、全局pid、局部pid
- 服务发现框架 —————— 开开开山怪
- Java 求阴历(C++ 求阴历方法的转换)
- Discuz仿魔客吧模板/素材资源站模板/包含DIY文件
- bzoj4008亚瑟王
- 为什么我的背景图片加载不出来
- Win32 API 概论
- 完整iOS APP发布App Store上架流程指南
- 关于安卓上pcm文件转wav全是噪音解决办法
- FFmpeg分离(解封装)视频和音频