ブロック式内で、定義された変数、関数は、そのブロック内でのみ有効になります。
// トップレベル
var a ;
func fn (a) {
println ("value = ", a) ;
}
a = 10 ;
fn(a) ; // この結果は -> value = 10
// ブロック式開始
{
var a ;
func fn (a)
{
println ("値は",a) ;
}
// ここでは、トップレベルの a, fn は、隠蔽されこのブロッ
// ク内で定義された、a, fn が有効になる
a = 20 ;
fn (a) ; // この結果は -> 値は20
}
// ブロック式終わり
// この時点で、スコープはトップレベルのスコープに切り替わり、
// トップレベルの a, fn が再び有効になる
fn(a) ; // この結果は -> value = 10
上記のプログラムを実行すると、
value = 10
値は20
value = 10
となります。
無スコープブロック式の場合は、このスコープルールは摘要されませ ん。無スコープブロック内で定義された、関数、変数は、を抜けた後 も有効となります。
// トップレベル
var a ;
func fn (a) {
println ("value = ", a) ;
}
a = 10 ;
fn(a) ; // この結果は -> value = 10
// 無スコープブロック式開始
{{
var a ;
func fn (a)
{
println ("値は",a) ;
}
// ここでは、トップレベルの a, fn は、隠蔽されこのブロッ
// ク内で定義された、a, fn が有効になる
a = 20 ;
fn (a) ; // この結果は -> 値は20
}}
// 無スコープブロック式終わり
// 無スコープブロック内での、変数、関数定義はブロックを抜けた
// 後でも有効
fn(a) ; // この結果は -> 値は20
上記のプログラムを実行すると、
value = 10
値は20
値は20
となります。