闭包的概念和闭包与lambda表达式的关系
来源:互联网 发布:好听的云南网络山歌 编辑:程序博客网 时间:2024/06/05 16:25
一。Javascript中闭包:
1.变量的作用域
要理解闭包,首先必须理解Javascript特殊的变量作用域。变量的作用域无非就是两种:全局变量和局部变量。
Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量
另一方面,在函数外部自然无法读取函数内的局部变量。
这里有一个地方需要注意,函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!
2.如何从外部读取局部变量
出于种种原因,我们有时候需要得到函数内的局部变量。但是,前面已经说过了,正常情况下,这是办不到的,只有通过变通方法才能实现。那就是在函数的内部,再定义一个函数。
既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们不就可以在f1外部读取它的内部变量了嘛!
3.JS闭包的概念
上面的f2函数,就是闭包。闭包其实就是定义在一个函数内部的函数(因为是子函数所以能够读取所在父函数的内部变量)。在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
4.闭包的用途
1.可以读取函数内部的变量.2.让这些变量(闭包引用的变量)的值始终保持在内存中。
在这段代码中,result实际上就是闭包f2函数。它一共运行了两次,第一次的值是999,第二次的值是1000。这证明了,函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。
为什么会这样呢?原因就在于f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。
这段代码中另一个值得注意的地方,就是“nAdd=function(){n+=1}”这一行,首先在nAdd前面没有使用var关键字,因此 nAdd是一个全局变量,而不是局部变量。其次,nAdd的值是一个匿名函数(anonymous function),而这个
匿名函数本身也是一个闭包,所以nAdd相当于是一个setter,可以在函数外部对函数内部的局部变量进行操作。
5.使用闭包的注意点
1.由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包2.闭包会在父函数外部,改变父函数内部变量的值。
二。Java中的闭包
1.java中闭包的定义
定义:闭包能够将一个方法作为一个变量去存储,这个方法有能力去访问所在类的自由变量。
Java8 语言之前本身还没有正式支持闭包,但它却允许模拟闭包(内部类+接口)。可以使用匿名的内部类来实现闭包。
如何让这个普通对象能够访问所在类的自由变量?内部类。内部类能够访问外部类的所有属性及方法。
隐藏具体实现是内部类的作用之一,如何保证隐藏具体实现的同时还能将闭包传递到外部使用?让内部类实现通用接口,然后将内部类对象向上转型为接口类型。2.代码简单实现:
三、闭包与lambda表达式
你可能已经听说过闭包(closure,不要和Clojure编程语言混淆)这个词,你可能会想Lambda是否满足闭包的定义。用科学的说法来说,闭包就是一个函数的实例/变量,且它可以无限制地访问那个函数的非本地变量。例如,闭包可以作为参数传递给另一个函数。它也可以访问和修改其作用域之外的变量。现在,Java 8的Lambda和匿名类可以做类似于闭包的事情:它们可以作为参数传递给方法,并且可以访问其作用域之外的变量。但有一个限制:它们不能修改定义Lambda的方法的局部变量的内容。这些变量必须是隐式最终的。
阅读全文
0 0
- 闭包的概念和闭包与lambda表达式的关系
- lambda表达式的解析(五) Lambda表达式与闭包类型
- 【Python笔记】Python的几个高级语法概念浅析:lambda表达式 && 闭包 && 装饰器
- Lambda表达式和闭包Closure
- Lambda与闭包
- C++11闭包函数:Lambda表达式的使用λ
- python中的lambda表达式的闭包和filter()产生的bug
- 浅谈Java 7的闭包与Lambda表达式之优劣
- 【闭包】的概念
- 闭包的概念
- 闭包的概念、形式与应用
- 闭包的概念、形式与应用
- 闭包的概念、形式与应用
- 闭包的概念、形式与应用
- 闭包的概念、形式与应用
- 闭包的概念、形式与应用
- 闭包的概念、形式与应用
- 闭包的概念、形式与应用
- 大公司和小公司产品工作有哪些区别?
- Linux系统资源查看
- java单例模式的几种不同实现
- 算法提高 ADV-224 9-1九宫格
- CentOS7安装Tomcat
- 闭包的概念和闭包与lambda表达式的关系
- Opencv--20行代码实现椭圆检测
- linux基础之inode解密
- LeetCode -- Add Digits
- 动静分离,提高网页访问速度
- css 页面架构
- 记忆化搜索学习
- git 上传本地项目到githut中
- 机器学习svm算法python代码实现