Lua变量的范围是什么?

我非常想知道为什么这段代码能够正常工作并打印出相同的表格。

t = {

    f = function()
        return t
    end

}

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

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

点赞
用户485561
用户485561

由于您的示例中没有本地变量t,因此您的函数访问全局变量t(即:_ENV.t)。当调用函数时,它会访问_ENV变量的当前值,然后索引该_ENV值的“t”索引。即使在函数定义时_ENV表中不包含“t”,但在稍后调用时,它确实包含“t”,因此您能够访问您新定义的表。

local u = {
    f = function()
        -- 访问全局变量“t”(即_ENV.t)。
        -- 每次调用函数时,都会返回“t”的*当前*值。
        return t
    end
}

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

t = u

print(t) -- 输出 table: 0xFOOBAR
print(t.f()) -- 输出 table: 0xFOOBAR

_ENV = {print = print}
print(u.f()) -- 输出nil,因为_ENV.t 现在是 nil

local _ENV = {print = print, t = u}
print(u.f()) -- 仍输出nil,因为函数定义使用的是在函数定义中词法上可见的_ENV变量,
             -- 而不是刚刚定义的新_ENV变量。

使用_ENV表示这些示例仅适用于Lua 5.2,但对于Lua 5.1同样适用。

2014-05-22 09:55:00