lua中同时定义和调用函数

sag*_*aga 3 javascript lua closures

在 javascript 中,可以通过同时定义和调用函数来快速创建闭包,如下所示:

function() {
    local something = 1;
    return function () {
        // something
    }
}()
Run Code Online (Sandbox Code Playgroud)

是否可以在 中做同样的事情lua

cyc*_*ist 7

是的,您可以在 Lua 中创建立即调用函数表达式 (IIFE)。Lua 需要在函数表达式两边加上括号:(function () return 10 end)()。删除括号 ,function () return 10 end()您将收到语法错误。并且命名该函数是不可能的:(function f() return 10 end)()。命名函数语法是将函数赋值给变量的语法糖f = function() return 10 end,并且赋值不是Lua中的表达式,因此它们不能被称为函数。

JavaScript需要在函数表达式周围或整个函数周围加上括号加上函数调用括号组合:(function () { return 10; })()(function () { return 10; }())。括号确保function () {}被解释为函数表达式而不是函数声明。与第二个结构等效的 ,(function () return 10 end())在 Lua 中是无效的。在 JavaScript(而非 Lua)中,您可以在函数表达式中提供名称,并且在出现错误时该名称将显示在堆栈跟踪中:(function f() { return 10; })()(function f() { return 10; }())