Lua变量的范围是什么?

时间:2014-05-22 09:48:20

标签: lua

我真的很感兴趣为什么代码的和平起作用并打印相同的表格。

t = {

    f = function()
        return t
    end

}

print(t)
print(t.f())

我的假设是t只能在定义后才能访问,因此return t应该失败。但是这段代码似乎是矛盾的。

1 个答案:

答案 0 :(得分:4)

由于示例中没有局部变量t,因此您的函数将访问全局t(即_ENV.t)。调用函数时,它会访问_ENV变量的当前值,然后索引到该_ENV值的"t"索引。即使_ENV表在定义函数时不包含t,但稍后调用它时, 包含t,因此您可以访问新的定义表。

local u = {
    f = function()
        -- Refers to the global variable `t` (that is, _ENV.t).
        -- Whenever the function is called, the *current* value of `t` is returned
        return t 
    end
}

print(u) -- prints table: 0xFOOBAR
print(u.f()) -- prints nil

t = u

print(t) --prints table: 0xFOOBAR
print(t.f()) --prints table: 0xFOOBAR

_ENV = {print = print}
print(u.f()) -- prints nil, since _ENV.t is now nil

local _ENV = {print = print, t = u}
print(u.f()) -- still prints nil, because the function definition used the
             -- _ENV variable that was lexically visible at the function definition,
             -- rather than the new _ENV variable that was just defined.

使用_ENV意味着这些示例仅对Lua 5.2有效,但同样的原则适用于Lua 5.1。