変数のスコープ

レキシカルスコープ

a = 1
function f(x, y)
  return(x+a, y+a)
end
print(f(1, 2)) # => 2, 3
a = 2
print(f(1, 2)) # => 3, 4

また、 local 宣言でローカルスコープを積むことができる。ただしローカルスコープの終端が決定できないので、積むときには

do
local a = 1
end
print(a)  # => nil

などとする。

なお、グローバルスコープ全体を表現するテーブル _G というのがある。これを使うと、 local 宣言したものは(終端がわからないとしても)ローカルなスコープでしかないことが確かめられる。

a = 1
for i, j in _G do
  print(i, j)  # a がある
end
local b = 1
for i, j in _G do
  print(i, j)  # a はあるが b はない
end
local a = 2
print(a)    # => 2
print(_G.a) # => 1