----本文摘自programming in lua
如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)
当一个函数内部嵌套另一个函数定义时,内部的函数体可以访问外部的函数的局部变量,这种特征我们称作词法定界。虽然这看起来很清楚,事实并非如此,词法定界加上第一类函数在编程语言里是一个功能强大的概念,很少语言提供这种支持。
下面看一个简单的例子,假定有一个学生姓名的列表和一个学生名和成绩对应的表,现在想根据学生的成绩从高到低对学生进行排序,可以这样做:names = {"Peter", "Paul", "Mary"}
grades = {Mary = 10, Paul = 7, Peter = 8}
table.sort(names, function (n1, n2)
return grades[n1] > grades[n2] -- compare the grades
end) function sortbygrade (names, grades)
table.sort(names, function (n1, n2)
return grades[n1] > grades[n2] -- compare the grades
end)
end
看下面的代码:
function newCounter()
local i = 0
return function() -- anonymous function
i = i + 1
return i
end
end c1 = newCounter() print(c1()) --> 1 print(c1()) --> 2
c2 = newCounter() print(c2()) --> 1 print(c1()) --> 3 print(c2()) --> 2
function digitButton (digit)
return Button{ label = digit,
action = function ()
add_to_display(digit)
end
}
end oldSin = math.sin math.sin = function (x) return oldSin(x*math.pi/180) end
do
local oldSin = math.sin
local k = math.pi/180
math.sin = function (x)
return oldSin(x*k)
end
end do
local oldOpen = io.open
io.open = function (filename, mode)
if access_OK(filename, mode) then
return oldOpen(filename, mode)
else
return nil, "access denied"
end
end
end 原文:http://blog.csdn.net/x356982611/article/details/29811969