函数闭包
2015-11-01 15:47
316 查看
一、闭包定义
闭包是由函数和与其相关的引用环境组合而成的实体,是不是被说得一愣一愣的,其实换个方式解释就是:闭包=函数+引用环境。这里面函数比较容易理解,那么什么是引用的环境呢?先看一个样例:
这种类似的代码在安卓开发极其常见,特点是在onclick函数中引用了name,而name这不属于onclick函数的作用域范围内,在一些函数式语言中(scala),常常需要把一个函数作为参数传递,如果这个被传递的函数恰好引用了函数作用域外的一个字段怎么办?要知道这个值不属于这个函数,也就意味着这个值随时可能会被修改甚至是销毁。这时候就需要闭包出马了。闭包=函数+引用环境,这里面的引用环境就是指在函数中引用上下文的地方,上面
的例子中就是name字段,当然在一些复杂的函数中可能是一些别的引用。
那么到底该如何处理这种问题呢?一个简单的方式就是类似于递归的思想,保护现场,把所有的信息压栈,再在使用的时候弹栈。把所有的信息都打包封装了一下,在使用的时候在取出(自由变量捕获,这里面的捕获是引用的捕获,而不仅仅值得)。当内嵌函数体内引用到体外的变量时,将会把定义时涉及到的引用环境和函数体打包成一个整体(闭包)返回。现在给出引用环境的定义就容易理解了:引用环境是指在程序执行中的某个点所有处于活跃状态的约束(一个变量的名字和其所代表的对象之间的联系)所组成的集合。
附上scala语言编写的样例,java从某种意义上来说是支持闭包,支持的不是很彻底,例如上例中的name必须是final的(java 8中可以不是final,但是任然不能修改),:
testerCloser使用函数的currying化,可以给该函数传递两个值
输出结果:
参考文献:https://www.ibm.com/developerworks/cn/linux/l-cn-closure/
http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html
http://www.cnblogs.com/Jifangliang/archive/2008/08/05/1260602.html
闭包是由函数和与其相关的引用环境组合而成的实体,是不是被说得一愣一愣的,其实换个方式解释就是:闭包=函数+引用环境。这里面函数比较容易理解,那么什么是引用的环境呢?先看一个样例:
这种类似的代码在安卓开发极其常见,特点是在onclick函数中引用了name,而name这不属于onclick函数的作用域范围内,在一些函数式语言中(scala),常常需要把一个函数作为参数传递,如果这个被传递的函数恰好引用了函数作用域外的一个字段怎么办?要知道这个值不属于这个函数,也就意味着这个值随时可能会被修改甚至是销毁。这时候就需要闭包出马了。闭包=函数+引用环境,这里面的引用环境就是指在函数中引用上下文的地方,上面
的例子中就是name字段,当然在一些复杂的函数中可能是一些别的引用。
那么到底该如何处理这种问题呢?一个简单的方式就是类似于递归的思想,保护现场,把所有的信息压栈,再在使用的时候弹栈。把所有的信息都打包封装了一下,在使用的时候在取出(自由变量捕获,这里面的捕获是引用的捕获,而不仅仅值得)。当内嵌函数体内引用到体外的变量时,将会把定义时涉及到的引用环境和函数体打包成一个整体(闭包)返回。现在给出引用环境的定义就容易理解了:引用环境是指在程序执行中的某个点所有处于活跃状态的约束(一个变量的名字和其所代表的对象之间的联系)所组成的集合。
附上scala语言编写的样例,java从某种意义上来说是支持闭包,支持的不是很彻底,例如上例中的name必须是final的(java 8中可以不是final,但是任然不能修改),:
testerCloser使用函数的currying化,可以给该函数传递两个值
输出结果:
参考文献:https://www.ibm.com/developerworks/cn/linux/l-cn-closure/
http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html
http://www.cnblogs.com/Jifangliang/archive/2008/08/05/1260602.html
相关文章推荐
- 深入理解PHP之匿名函数
- Mootools 1.2教程 函数
- autoit InputBox 函数
- 文件遍历排序函数
- Ruby中使用Block、Proc、lambda实现闭包
- Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页
- ASP下经常用的字符串等函数参考资料
- PostgreSQL教程(五):函数和操作符详解(1)
- DOS批处理 函数定义与用法
- asp Chr 函数 数字转字母的方法
- Lua中的函数精讲笔记
- Lua中的闭合函数、非全局函数与函数的尾调用详解
- Lua中调用C++函数示例
- LUA中的闭包(closure)浅析
- Lua实现split函数
- Lua常用时间函数使用实例
- Lua中的闭包学习笔记
- Lua函数与字符串处理简明总结
- Lua学习笔记之表和函数
- Lua中实现sleep函数功能的4种方法