3.5 可視性規則

Lua は字句スコープ (lexically scope) の言語です。つまりローカル変数のスコープは宣言の直ぐ後ろにある文に始まり、最も内側のブロックに含まれる無文でない最後の文 (宣言含む) で終わります。例として次のプログラムを考えます:

x = 10                -- グローバル変数
do                    -- 新しいブロック
  local x = x         -- 新しい 'x', 値は 10
  print(x)            --> 10
  x = x+1
  do                  -- 新しいブロック
    local x = x+1     -- 新しい 'x'
    print(x)          --> 12
  end
  print(x)            --> 11
end
print(x)              --> 10  (グローバルの x)

三行目の宣言 local x = x では新しく定義される変数 x はまだスコープに入っていないので、この文に含まれる二つ目の x は外のブロックの変数を指します。

字句スコープの規則により、関数がローカル変数と同じスコープで定義された場合には、定義される関数はそのローカル変数に自由にアクセスできます。何らかのスコープの中で定義された関数がアクセスするローカル変数を、その関数のアップバリュー (upvalue) と呼びます。アップバリューは外部ローカル変数 (external local variable) あるいは外部変数 (extenral variable) とも呼ばれます。

local 文を実行するたびに新しいローカル変数が定義されることに注意してください。例えば

a = {}
local x = 20
for i = 1, 10 do
  local y = 0
  a[i] = function () y = y + 1; return x + y end
end

はクロージャ (無名関数のインスタンス) を十個生成します。これらのクロージャは異なる y と共通の x を持ちます。