在 Lua语言中,函数是严格遵循词法定界(lexical scoping )的第一类值(first-class v alue )。
- “第一类值”意味着函数也可以像其他常见类型的值一样,可以保存在变量或者表中。当然也可以将某个函数作为参数传递给其他函数或者作为其他函数的返回值进行返回。
- “词法定界”意味着 Lua语言中的函数可以访问包含其自身的外部函数中的变量(也意味着 Lua语言完全支持 Lambda 演算)。
两个特性结合就为Lua带来了极大的灵活性。比如程序可以通过重新定义函数来增加新功能,也可以通过擦除函数为不受信任的代码创建安全的运行环境。
同时还能组合出更多的编程技巧,比如多函数式编程(functional-language)。
那么如果函数是值的话,那该如何去创建一个函数的表达式呢?比如Lua的常见函数定义为:
它实际上只是下面这种写法的美化形式,也就是语法糖:
foo = function (x) return 2*x end