咨询两种不同函数定义形式的区别
Lua 两种函数定义写法的实际差异
对应提问中的两组代码分别是:
- 函数定义语法糖形式
function PrintHello() return print("Hello") end - 匿名函数赋值形式
PrintHello = function() return print("Hello") end
二者并非完全没有可观测差异,核心区别可以梳理为以下几点:
- 语法本质
- 第一种写法是Lua官方提供的便捷语法糖,在没有特殊作用域、元方法干扰的常规全局场景下,解析后会被直接转换为第二种匿名函数赋值的形式,最终实现的变量绑定逻辑完全一致。
- 实际行为差异
- 局部函数的自引用能力区别
如果加上local修饰定义局部函数,两种写法的差异会直接体现:- 写成
local function PrintHello() ... end时,局部变量PrintHello会在函数体创建完成后立刻完成绑定,函数内部如果要递归调用自身,可以正常匹配到这个局部变量,不会出现找不到引用的问题。 - 写成
local PrintHello = function() ... end时,赋值语句执行完成前,局部变量PrintHello还未完成绑定,函数体内部如果直接调用PrintHello,会优先匹配全局作用域下的同名变量,递归逻辑很容易失效。
- 写成
- 元方法触发逻辑一致
两种写法执行时都会按照当前作用域的规则查找已存在的PrintHello变量,完成函数值的写入;如果给全局表绑定了__newindex元方法,两种写法触发元方法的时机、传入参数完全一致,不会出现行为分叉。
- 局部函数的自引用能力区别
- 常规测试场景表现
没有特殊逻辑干扰的前提下,两种写法直接调用PrintHello()的输出没有任何区别,都会正常打印Hello字符串。
注意:Lua不存在JavaScript这类语言的函数提升机制,不管是哪种写法,只有在代码执行到对应定义行之后,
PrintHello变量才会持有可调用的函数值,提前调用会直接报未定义的错误。
内容的提问来源于stack exchange,提问作者Dyerrrr
相关产品推荐
相关产品推荐

