这个本地函数在作用域外部可以访问,有什么解释吗?

for i = 1, 20 do  --创建一个循环
  if i < 10 then
    local function LessThan10()
      return i
    end
  end
end
print(LessThan10())

令人惊讶的是,即使 LessThan10 在条件语句内部并且是一个 local 函数(实际上是变量),我仍然可以打印出答案。

这很有趣(我在 Zerobrane 中检查了 LessThan10 是一个本地函数)

编辑:我想这是我的解释器的问题,我改变了解释器,并且这个东西出现了错误。

点赞
用户12578266
用户12578266

我测试了一下,它只在 Lua 5.0 和 5.1 上有效。

我重新在 Lua 5.3 上测试了一遍,它不再有效了。

我的 zerobrane 无缘无故地将我的 Lua 版本重置为 5.0,如果这个问题让你失望了,我非常抱歉。

2020-08-18 10:05:20
用户13955436
用户13955436

在 Lua 5.0 解释器中测试:

Lua 5.0.3  版权所有 (C) 1994-2006 Tecgraf, PUC-Rio
> for i = 1, 20 do  -- 创建一个循环
>>   if i < 10 then
>>     local function LessThan10()
>>       return i
>>     end
>>   end
>> end
> print(LessThan10())
stdin:1: 尝试调用全局变量 ‘LessThan10’(一个空值)
stack traceback:
        stdin:1: in main chunk
        [C]: ?

我也无法相信这是/曾经是有效的代码,因为局部变量只在它们声明的块内可见。

如果您正在使用自定义的 Lua 解释器,那么您应该进一步调查一下,因为它似乎非常有趣。

2020-08-20 07:02:43