(个人理解,欢迎各位指正)
定义
- 最通俗直接的定义,如果一个函数访问了它的外部变量(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;
end
local inner = func(); --调用func()函数,返回内部函数给inner,打印:F
inner(); --调用内部函数,打印:1
inner(); --调用内部函数,打印:2
inner(); --调用内部函数,打印:3
local other = func(); --与inner不同的是,获取另一个内部函数实例,打印:F
other(); --调用另一个内部函数实例,打印:1
other(); --同上,打印:2
日常用途
- 常用来做定时器、计时器、循环函数等。
- 闭包经常用于创建含有隐藏数据的函数(但并不总是这样)。
- 闭包功能是一个很好的保存局部变量的方式,这一点对程序员的影响很大。
PS
经常是设计为显式函数名,把函数赋值成变量,再传递给函数作为参数进行使用。
function a(func) print(func(2)) end function b(arg) return arg * arg end a(b) --把b函数传递给a作为参数