Bir değişkenin
kapsamı
, sözlü bir başvuruyla değişkene erişilebilen kod alanıdır.
Genel
değişken, kodunuzun tüm alanlarında tanımlı değişkenken,
yerel
değişken ise kodunuzun yalnızca bir bölümünde tanımlı değişkendir. ActionScript 3.0'da değişkenlere her zaman bildirildikleri işlev veya sınıf kapsamı atanır. Genel bir değişken, herhangi bir işlev veya sınıf tanımı dışında tanımladığınız bir değişkendir. Örneğin, aşağıdaki kod, herhangi bir işlevin dışında genel işlevi bildirerek
strGlobal
genel işlevini oluşturur. Bu örnek, genel bir değişkenin, işlev tanımının içinde ve dışında kullanılabilir olduğunu gösterir.
var strGlobal:String = "Global";
function scopeTest()
{
trace(strGlobal); // Global
}
scopeTest();
trace(strGlobal); // Global
Bir işlev tanımı içindeki değişkeni bildirerek yerel bir değişkeni bildirmiş olursunuz. Yerel değişkeni tanımlayabileceğiniz en küçük kod alanı, işlev tanımıdır. Bir işlev içinde bildirilen yerel değişken yalnızca o işlev içinde varolur. Örneğin,
localScope()
adındaki bir işlevin içinde
str2
adında bir değişkeni bildirirseniz, bu değişken söz konusu işlevin dışında kullanılamaz.
function localScope()
{
var strLocal:String = "local";
}
localScope();
trace(strLocal); // error because strLocal is not defined globally
Yerel değişkeniniz için kullandığınız değişken adı önceden genel değişken olarak bildirilmişse, yerel değişken kapsamdayken, yerel tanım genel tanımı gizler (veya gölgeler). Genel değişken, işlev dışında varolmaya devam eder. Örneğin, aşağıdaki kod,
str1
adında genel bir dize değişkeni oluşturur ve sonra
scopeTest()
işlevinin içinde aynı adda yerel bir değişken oluşturur. İşlevin içindeki
trace
deyimi, değişkenin yerel değerini verirken, işlevin dışındaki
trace
deyimi de değişkenin genel değerini verir.
var str1:String = "Global";
function scopeTest ()
{
var str1:String = "Local";
trace(str1); // Local
}
scopeTest();
trace(str1); // Global
ActionScript değişkenleri, C++ ve Java uygulamalarındaki değişkenlerden farklı olarak, blok düzeyi kapsamına sahip değildir. Kod bloğu, açma küme parantezi (
{
) ile kapatma küme parantezi (
}
) arasındaki herhangi bir deyim grubudur. C++ ve Java gibi bazı programlama dillerinde, kod bloğu içinde bildirilen değişkenler o kod bloğunun dışında kullanılamaz. Bu kapsam sınırlamasına blok düzeyi kapsamı denir ve bu kapsam sınırlaması ActionScript'te bulunmaz. Bir kod bloğu içinde bir değişken bildirirseniz, bu değişken yalnızca o kod bloğunda değil, kod bloğunun ait olduğu diğer işlev parçalarında da kullanılabilir. Örneğin, aşağıdaki işlev, çeşitli blok kapsamlarında tanımlanmış değişkenleri içerir. Tüm değişkenler, işlev boyunca kullanılabilir.
function blockTest (testArray:Array)
{
var numElements:int = testArray.length;
if (numElements > 0)
{
var elemStr:String = "Element #";
for (var i:int = 0; i < numElements; i++)
{
var valueStr:String = i + ": " + testArray[i];
trace(elemStr + valueStr);
}
trace(elemStr, valueStr, i); // all still defined
}
trace(elemStr, valueStr, i); // all defined if numElements > 0
}
blockTest(["Earth", "Moon", "Sun"]);
Blok düzeyi kapsamı olmamasının işaret ettiği ilginç bir nokta, işlev sona ermeden değişken bildirildiği sürece, bir değişken bildirilmeden o değişkene okuma ve yazma işlemi yapabilmenizdir. Bunun nedeni, derleyicinin tüm değişken bildirimlerini işlevin en üstüne taşıdığını belirten,
kaldırma
adındaki bir tekniktir. Örneğin,
num
değişkeninin ilk
trace()
işlevi,
num
değişkeni bildirilmeden önce olsa da, aşağıdaki kod derleme yapar:
trace(num); // NaN
var num:Number = 10;
trace(num); // 10
Ancak derleyici, atama deyimlerini kaldırmaz. Bu da,
num
değişkeninin ilk
trace()
işlevinin neden Number veri türü için varsayılan değişken değeri olan
NaN
(sayı değil) sonucunu verdiğini açıklar. Başka bir deyişle, aşağıdaki örnekte gösterildiği gibi, değişkenler bildirilmeden değişkenlere değer atayabilirsiniz:
num = 5;
trace(num); // 5
var num:Number = 10;
trace(num); // 10