2.2 環境とグローバル環境

§ 3.2§ 3.3.3 でさらに説明しますが、自由な (どんな宣言にも束縛されていない) 名前 var は構文的に _ENV.var へ変換されます。また全てのチャンクは _ENV という名前の外部ローカル変数のスコープでコンパイルされるので、_ENV はチャンク内で自由な名前となることがありません (参照: § 3.3.2)。

この外部変数 _ENV と自由な名前の変換規則が存在するにもかかわらず、_ENV は通常の名前として利用できます。例えば _ENV という名前の変数やパラメータを定義できます。自由な名前への参照はプログラムのその時点で見えている _ENV を使って解決され、そのときには Lua の可視性に関する通常の規則 (§ 3.5) が適用されます。

_ENV の値として使われるテーブルを環境 (environment) と呼びます。

Lua はグローバル環境 (global environment) と呼ばれる他の環境と区別される環境を持ちます。この値は C レジストリ (§ 4.3) の特別な場所に保存され、Lua のグローバル変数 _G がこの値で初期化されます (_G は Lua 内部で使われないので、_G を書き換えたときに影響があるのはアプリケーションのコードだけです)。

Lua がチャンクをロードするとき、そのチャンクに関連付けられる _ENV 変数に対するデフォルト値はグローバル環境です (参照: load)。そのためデフォルトでは、Lua コード内の自由な名前はグローバル環境の要素を指すことになります。このため自由な名前はグローバル変数 (global variable) とも呼ばれます。また全ての標準ライブラリはグローバル環境にロードされ、その一部はグローバル環境で実行されます。loadloadfile を使うと異なる環境を持ったチャンクをロードできます (C ではチャンクをロードした後にアップバリューを設定する必要があります。参照: lua_setupvalue)。