闭包
来源:互联网 发布:致胜轮毂数据 编辑:程序博客网 时间:2024/05/17 20:31
(个人理解,欢迎各位指正)
定义
- 最通俗直接的定义,如果一个函数访问了它的外部变量(upvalue),那么这个函数就成了一个闭包。
- 放宽部分严谨性的更容易理解的定义,如果外部函数中嵌套的内部函数,内部函数调用外部函数的变量,并且该内部函数作为外部函数的return值,那么return的这个内部函数就是一个闭包。(当然,外部函数不是闭包的必需品)
关键词
upvalue:
(用内外函数介绍)如果内部函数中调用外部函数的某个变量,这个变量对内部函数来说不是全局变量也不是局部变量,我们称之为“外部的局部变量”(external local variable)或者upvalue。
函数:
技术上来讲,闭包指“值”而不是指函数,函数仅仅是闭包的一个原型声明;尽管如此,在不会导致混淆的情况下我们继续使用术语函数代指闭包。
外部函数:
外部函数不是必需的!通过访问外部变量,一个闭包可以“维持”这些变量的存在。对应到有外部函数的情况的表现,如果任何一个或多个内部函数在外部函数退出后却没有退出,那么内部函数就维持了外部函数的这些局部数据。
举例子
1、这个调用了tmp,但不算闭包
function foo(x) { var tmp = 3; function bar(y) { alert(x + y + (++tmp)); } bar(10);}foo(2)
2、return这个内部函数时,就成了一个闭包
function foo(x) { var tmp = 3; return function (y) { alert(x + y + (++tmp)); }}var bar = foo(2); // bar现在是一个闭包bar(10);
3、面向对象思维编程
function func() local index = 1; print("F"); return function() print(index); index = index + 1; endlocal inner = func(); --调用func()函数,返回内部函数给inner,打印:Finner(); --调用内部函数,打印:1inner(); --调用内部函数,打印:2inner(); --调用内部函数,打印:3local other = func(); --与inner不同的是,获取另一个内部函数实例,打印:Fother(); --调用另一个内部函数实例,打印:1other(); --同上,打印:2
日常用途
- 常用来做定时器、计时器、循环函数等。
- 闭包经常用于创建含有隐藏数据的函数(但并不总是这样)。
- 闭包功能是一个很好的保存局部变量的方式,这一点对程序员的影响很大。
PS
经常是设计为显式函数名,把函数赋值成变量,再传递给函数作为参数进行使用。
function a(func) print(func(2))endfunction b(arg) return arg * argenda(b) --把b函数传递给a作为参数
参考文章:
闭包_搜狗百科
Javascript闭包——懂不懂由你,反正我是懂了
lua语言中闭包的学习心得
0 0
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- C#多线程锁
- HDU 2639 Bone Collector II(0-1背包第k优解)
- 比较两个数组间有什么不同
- Filter过滤器中访问getSession()要转化
- 使用 Docker 搭建 Java Web 运行环境
- 闭包
- NYOJ 169
- java进程、线程通信方法以及进程与线程的区别
- JDBC 第一篇
- POJ3468-线段树+lazy思想
- 获取Chrome浏览器的Cookie
- android studio运行AVD时显示“CPU acceleration status:HAXM must be updated(version 1.1.1<6.0.1)”
- POJ 1416 Shredding Company (DFS)
- mtk 6572平台led指示灯 调试