闭包的理解
来源:互联网 发布:恋夜秀场破解软件酷安 编辑:程序博客网 时间:2024/06/01 17:42
今天被小伙伴问到了闭包,虽然自己原来也看到一些关于闭包的文章,但是发现自己什么都说不出,所以又到了学习的时刻了。
首先先去百科了下闭包的概念:
闭包就是能够读取其他函数内部变量的函数。由于在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。
咱们将这段话拆分开说:
- 能到读取到其他函数内部变量的函数。
首先闭包也是一个“函数”,然后才是有“能够读取到其他函数变量”的功能。 - javascript中理解成“定义在一个函数内部的函数”
- 将函数内部和外部连接起来的桥梁
将话分成了三部分,果然理解起来就容易多了。我在网上也找到了很多介绍闭包的文章,例如
http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html
,但无奈本人是java程序员理解起来还是不够清晰,所以还是谢了自己的java理解版本,如下:
package com.xstore.tms.center.web;import java.util.function.Function;/** * @author yang.bai on 2017/12/10. */public class Test1 { class Obj1{ String str = "123"; public String getStr() { return str; } public void setStr(String str) { this.str = str; } @Override public String toString() { return "Obj1{" + "str='" + str + '\'' + '}'; } } Function<Integer, Integer> functionA = null; public void test1(){ Obj1 b = new Obj1(); System.out.println(b); functionA = (Integer a) ->{ b.setStr("456"); System.out.println(b); return a++; }; } public static void main(String[] args){ Test1 test1 = new Test1(); test1.test1(); test1.functionA.apply(3); }}
首先在我们分子这个demo之前我们先思考一个问题,
如果我想在函数A里面访问函数B的局部变量我该如何做到呢???
在不知道闭包之前,答案是“做不到”。所以可以说闭包就是来做这件事的。
然后让我们来分析这个demo:
这个demo里有两个函数,main函数和test1函数,test1函数里面内部函数functionA,functionA访问了局部变量b(我们这里甚至做到了修改)。
public void test1(){ Obj1 b = new Obj1(); System.out.println(b); functionA = (Integer a) ->{ b.setStr("456"); System.out.println(b); return a++; }; }
所以,按照闭包概念理解的话,functionA就是闭包,起到了连接函数内部和函数外部的作用。
我们一开始理解闭包的时候,总是容易被“闭包”这两个字带偏,容易联想到其他关于这两个字的想象,我觉得只需要记住一点就好了。
闭包就是一个有特殊作用的函数。
阅读全文
0 0
- 闭包的理解
- 闭包的理解
- 闭包的理解
- 闭包的理解
- 闭包的理解
- 闭包的理解
- 闭包的理解
- 闭包的理解
- 理解javascript的闭包
- 理解闭包的概念
- 理解Javascript的闭包
- 理解Javascript的闭包
- 理解Javascript的闭包
- 理解Javascript的闭包
- Javascript的闭包理解
- 理解Javascript的闭包
- groovy 闭包的理解
- javascript 闭包的理解
- LeetCode-028 Implement strStr()
- [NTT][斯特林数]BZOJ 5093: 图的价值
- 哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)A 所有情况的和
- debain9的亮度调整失败
- 鼠标事件的使用
- 闭包的理解
- 批量给pdf添加目录(最完整详细方法)
- LeetCode14. Longest Common Prefix
- [DP]Atcoder CODE FESTIVAL 2017 Final (Parallel) D
- Lambda 表达式
- 串行通信
- 图的广度遍历-邻接链表表示
- jvm学习之jvm基础
- 精通正则表达式:4