W przypadku jeśli wewnątrz jakiegoś obszaru lokalnego (np. w ciele funkcji OnStart()) zostanie utworzony inny obszar lokalny (np. operatora if), to zmienne utworzone w OnStart() będą widoczne dla programu również i w tym nowym obszarze. Przeanalizujmy poniższy przykład (kod 1).
#property strict
int GlobalVariable = 555;
bool GlobalFlag = true;
//--- granica obszaru lokalnego OnStart(), początek
void OnStart()
{
int LocalVariable = 7;
//--- granica obszaru lokalnego 'if', początek
if(GlobalFlag == true)
{
Print("GlobalVariable = ",GlobalVariable);
Print("LocalVariable = ",LocalVariable);
}
//--- granica obszaru lokalnego 'if', koniec
}
//--- granica obszaru lokalnego OnStart(), koniec
Korzystając z mocy naszej wyobraźni, spróbujmy teraz zobaczyć ten kod w 3D (rys. 1).
Rys. 1. Schemat programu: poziom globalny i obszary lokalne.
Wiemy już, że zmienne globalne są widoczne dla programu we wszystkich obszarach lokalnych, dlatego skupmy się teraz na zmiennych lokalnych. W powyższym kodzie 1 w OnStart() najpierw została zainicjonowana zmienna LocalVariable (platforma nr 2, rys. 1). Następnie operator if tworzy nowy obszar lokalny (platforma nr 3), znajdujący się wewnątrz obszaru utworzonego przez OnStart(). Gdyby warunek if(GlobalFlag == true) okazał się fałszywy, wtedy program nie musiałby wykonywać zadań wymaganych przez ten operator i nowy obszar by nie powstał.
W naszym przypadku warunek jest prawdziwy (GlobalFlag == true, tj. true == true to prawda), dlatego program otrzyma zadanie wyświetlić komunikaty za pomocą dwóch funkcji Print(). W 1 przypadku program będzie musiał skorzystać ze zmiennej globalnej GlobalVariable, a w 2 przypadku ze zmiennej lokalnej LocalVariable z "niższego" obszaru. Mówiąc inaczej, będąc na wyższej platformie, program widzi zmienne utworzone na "niższych" platformach.
Jeśli wewnątrz obszaru lokalnego if za pomocą jakiegoś operatora utworzymy nowy obszar lokalny, a w nim kolejny itd., to będąc na "wyższych" platformach program nadal będzie widział zmienne utworzone na wszystkich "niższych" platformach. Zobaczymy to na przykładzie kodu 2.
#property strict
//--- inicjalizacja dwóch zmiennych globalnych
int GlobalVariable = 555;
bool GlobalFlag = true;
//--- 2. granica obszaru lokalnego OnStart(), początek
void OnStart()
{
int LocalVariable = 7; // inicjalizacja zmiennej lokalnej
//--- 3. granica obszaru lokalnego 'if' dla GlobalFlag, początek
if(GlobalFlag == true)
{
//--- 4. granica obszaru lokalnego 'if' dla GlobalVariable, początek
if(GlobalVariable == 555)
{
//--- 5. granica obszaru lokalnego 'if' dla LocalVariable, początek
if(LocalVariable == 7)
{
Print("GlobalVariable = ",GlobalVariable);
Print("LocalVariable = ",LocalVariable);
}
//--- 5. granica obszaru lokalnego 'if' dla LocalVariable, koniec
}
//--- 4. granica obszaru lokalnego 'if' dla GlobalVariable, koniec
}
//--- 3. granica obszaru lokalnego 'if' dla GlobalFlag, koniec
}
//--- 2. granica obszaru lokalnego OnStart(), koniec
Popatrzmy na ten kod "z boku" (rys. 2).
Rys. 2. Piramida obszarów lokalnych.
Na tym schemacie widzimy, że na poziomie globalnym (platforma nr 1) zainicjowano 2 zmienne globalne - GlobalVariable i GlobalFlag. W obszarze lokalnym, utworzonym przez OnStart() (platforma nr 2), zainicjowano 1 zmienną lokalną LocalVariable. Dalej za pomocą 3-ch operatorów if tworzone są 3 obszary lokalne, z których każdy znajduje się wewnątrz poprzedniego obszaru.
Na platformie nr 3 program potrzebuje mieć dostęp do GlobalFlag, aby móc sprawdzić warunek if(GlobalFlag == true). Na 4-ej platformie dostęp do GlobalVariable, aby sprawdzić warunek if(GlobalVariable == 555). Na 5-ej potrzebuje dostęp do LocalVariable w celu sprawdzenia warunku if(LocalVariable == 7) oraz do GlobalVariable i LocalVariable w funkcjach Print(). Program nie ma problemu z dostępem do tych zmiennych, dlatego że zostały one utworzone w poprzednich obszarach, tj. na "niższych" platformach (rys. 2, żółte i zielone strzałki).