lua--函数深入:闭合函数,局部函数,尾调用
lua函数具有两大特征:函数作为第一类值,函数具有特定的词法域(Lexical Scoping)
所谓第一类值:代表函数和其他传统类型的值是等价的(例如数字和字符串),函数可以同他们一样存储在变量,table中,可以作为实参传递,可以作为函数返回值。
对于第一类值,需要讲明,函数和其他值一样都是匿名的,是没有名字的。而我们平时所说的函数名,如print(),都只是一种语法糖,一个持有某个函数的变量。
例如:
function foo(x) return 2*x end --->等价于 foo = function(x) return 2*x end
函数定义实际上是一条赋值语句。这条语句先创建一个类型为函数的值,然后将其赋值给一个变量。
我们将表达式“function (x) <body> end”视为函数的构造式,又被称其为匿名函数,在某些特殊情况下,我们会用到匿名函数。
特定的词法域(Lexical Scoping):指一个函数可以嵌套在另一个函数中,内部的函数可以访问外部函数的变量。
闭合函数(closure)
由于词法域的原因,当一个函数写在另一个函数内部,而这个内部函数可以访问外部函数的局部变量,这个被访问的局部变量既不是全局的也不是局部的,被称为非局部的变量(non-local variable).
所以闭合函数就是这个内部函数加上该函数需要访问的所有的非局部变量的函数。
关于闭包的实现原理,推荐以下博客http://blog.csdn.net/maximuszhou/article/details/44280109。
关于闭包,有几个需要注意的地方:
e.g.
function newCounter()local i = 0;return function()i = i+1return iend
endc = newCounter() -- newCounter返回匿名函数赋予变量c,此时c是一个闭包,同时拥有一个upvalue值
print(c()) -->1
print(c()) -->2 --匿名函数再次访问闭包中的upvalue值,使其加1.--注意,如果再次调用newCounter,它将创建一个新的闭包,该闭包将拥有一个新的upvalue.
c1 = newCounter() -- 返回新的闭包,赋值给变量c1.--同时需要注意:如果一个函数内部,有多个闭合函数,这些闭合函数如果需要访问同一个外部变量,那么这个upvalue在这些闭包之间是共享的。、
--e.g.
function f()local i = 0local function foo1()i = i +1return print(i)endlocal function foo2()i = i+10return print(i)endreturn foo1, foo2
end
t1,t2 = f() -- t1,t2闭包函数共享i这个upvalue值。
t1() -->1
t2() -->11
闭包有很多作用,主要体现在,当上一级函数的局部变量被释放后,还可以通过闭包函数的upvalue值获的访问。
lua--函数深入:闭合函数,局部函数,尾调用相关推荐
- Lua程序设计 | 字符串、表、函数与IO
From<Programming in Lua> by Roberto Ierusalimschy 文章目录 字符串 字符串常量 长字符串/多行字符串 强制类型转换 字符串标准库 表 表索 ...
- ES6 尾调用和尾递归优化
尾调用 尾调用(Tail Call)是函数式编程的一个重要概念,就是指某个函数的最后一步是调用另一个函数. function fun(x){return a(x); } 上面代码中,函数fun的最后一 ...
- Lua 函数、闭包、尾调用总结
<lua 程序设计>在线阅读:http://book.luaer.cn/ 1.函数 函数有两种用途: 完成指定的任务,这种情况下函数作为调用语句使用: 计算并返回值,这种情况下函数作为赋值 ...
- 查看某个方法在哪里被调用_MATLAB局部函数公有化的方法: localfunctions
知乎视频www.zhihu.com MATLAB的一个函数文件里面, 开头第一个函数是可以被外部调用的, 而其他函数是无法直接被外部调用的, MATLAB称之为局部函数. 如果用OOP的术语来说, ...
- 递归循环一个无限极数组_理解递归、尾调用优化和蹦床函数优化
想要理解递归,您必须先理解递归.开个玩笑罢了, 递归 是一种编程技巧,它可以让函数在不使用 for 或 while 的情况下,使用一个调用自身的函数来实现循环. 例子 1:整数总和 例如,假设我们想要 ...
- Dotnet的局部函数和委托的对比
上一篇说了一下委托,这篇来说说局部函数和委托的对比. 把委托和局部函数放成前后篇,是因为这两个内容很像,用起来容易混. 需要了解委托相关内容,可以看这一篇 [传送门] 使用委托表达式(Lamb ...
- do语句转化为局部函数一例
do: (do ((x a (b x)) (y c (d y))) ((test x y) (z x y)) (f x y)) 局部函数: (lab ...
- 原来 JS 也支持跟 Lua 语意一样的内嵌函数的闭包概念
原来 JS 也支持跟 Lua 语意一样的内嵌函数的闭包概念. 我是从这里看来的: http://blog.dreambrook.com/soloist/archive/2005/03/13/526.a ...
- python函数局部变量_Python局部函数– functoolspartial()
python函数局部变量 什么是Python局部函数? (What is a Python Partial Function?) Sometimes a function accepts multip ...
最新文章
- Java相对路径/绝对路径总结(转)
- php-fpm 没有启动脚本,php-fpm服务启动脚本
- Velocity 页面加减运算
- C++11 多线程库使用说明
- MySQL 数据库添加数据时为什么会产生外码(外键)约束?原理就是什么?如何解决?
- golang实现四种排序(快速,冒泡,插入,选择)
- 电脑不识别移动硬盘怎么办_U盘插入电脑后不识别无法读取的解决方法
- 拓端tecdat|R语言混合效应逻辑回归(mixed effects logistic)模型分析肺癌数据
- Android发短信功能
- SpringBoot项目 四种读取properties文件的方式
- 算法学习-求平方根函数
- retrofit简单的网络请求
- Tableau实战 Tableau官网各版块访问情况(四)各网址情况分析
- Matplotlib_2
- 电脑远程控制,自动重启,断电重启,网络自动连接
- Heritrix3.0
- Linux之常见的通配符
- centos7 moloch安装及优化
- Arduino超声波测距模块控制蜂鸣器
- 怎么放大图片保持清晰度?如何把图片无损放大?
热门文章
- js设置和获取html和文本,JS---DOM---设置和获取---标签内容和文本内容
- 怀旧服10月3日服务器维护,魔兽怀旧服:即将开放怀旧服PTR服务器 3/10开放阿拉希...
- 2018年最新版微信公众号本地测试方案
- 使用element ui select下拉框多选,编辑状态下回显数据
- 阳光厨房——软件需求工程与UML建模
- 苹果手机看html文件效果,如何在ios手机端的Safari浏览器中“查看网页源代码”...
- HTML中容器(div)动态加载HTML页面的方法
- 字符串逆序(递归实现)
- 【Spring】Spring底层核心原理解析
- 论文学习——分段时间序列相似性研究与应用