2016-04-26 14 views
5

で私は、これは私がやるルア - ローカル変数のスコープ機能

次のスクリプト

local a = 1 
function test() 

    local function test2() 
     print(a) 
    end 

    test2() 
end 

test() 

プリントアウト1.

をnilを出力し

以下の機能を持っていますこれを理解していない。ローカル変数を宣言することはブロック全体で有効になると思いました。変数 'a'はtest() - functionスコープで宣言されており、同じスコープ内でtest2() - 関数が宣言されているので、なぜtest2()はtest()ローカル変数にアクセスできませんか?

+3

ルアはjavascriptではなく、変数を「ホイスト」しません。 –

答えて

4

test2は既に宣言されている変数にアクセスできます。注文事項だから、test2aを宣言:

function test() 

    local a; -- same scope, declared first 

    local function test2() 
     print(a) 
    end 

    a = 1; 

    test2() -- prints 1 

end 

test()
+6

"ローカル変数のスコープは、宣言後の最初のステートメントから始まり、宣言を含む最も内側のブロックの最後の非空文まで続きます。 - http://www.lua.org/manual/5.3/manual.html#3.5 –

+0

実際には、 'local a'部分のみが最初に来る必要があります。その部分に割り当てられた値はまだ分かっていない可能性があります。したがって、割り当ては依然として内部関数の定義に従うことができます。 – tonypdmtr

+0

@tonypdmtrだから、私が言ったのは、_ "宣言された_"。 – canon

2

aが使用されている場合aのための宣言が見られていないので、コンパイラはグローバルであることをaを宣言するためにあなたが最初の例ではnilを取得します。 testを呼び出す前にaを設定すると正常に動作します。しかし、あなたがaをローカルとして宣言すれば、それはできません。

関連する問題