변수의 범위는 코드에서 어휘 참조로 변수에 액세스할 수 있는 영역입니다. 전역 변수는 코드의 모든 영역에 정의되는 반면 로컬 변수는 코드의 한 부분에만 정의됩니다. ActionScript 3.0에서 변수는 변수가 선언되는 함수 또는 클래스의 범위가 항상 지정됩니다. 전역 변수는 모든 함수 또는 클래스 정의 외부에 정의된 변수입니다. 예를 들어 다음 코드에서는 모든 함수 외부에 strGlobal 변수를 선언하여 전역 변수로 만듭니다. 이 예제에서는 함수 정의 내부와 외부에서 모두 사용할 수 있는 전역 변수를 보여 줍니다.
var strGlobal:String = "Global";
function scopeTest()
{
trace(strGlobal); // Global
}
scopeTest();
trace(strGlobal); // Global
함수 정의 내부에 변수를 선언하여 로컬 변수를 선언합니다. 함수 정의는 로컬 변수를 정의할 수 있는 가장 작은 코드 영역입니다. 함수 내에 선언된 로컬 변수는 해당 함수 안에서만 존재합니다. 예를 들어 localScope() 함수 내에 str2 변수를 선언하는 경우 해당 변수는 함수 외부에서 사용할 수 없습니다.
function localScope()
{
var strLocal:String = "local";
}
localScope();
trace(strLocal); // error because strLocal is not defined globally
로컬 변수에 사용하는 변수 이름이 이미 전역 변수로 선언되어 있는 경우 해당 로컬 변수가 범위 안에 있는 동안에는 로컬 정의에 의해 전역 정의가 가려집니다. 이러한 경우에도 전역 변수는 함수 외부에서 계속 존재합니다. 예를 들어 다음 코드에서는 str1이라는 전역 문자열 변수를 만든 다음 scopeTest() 함수 내에 동일한 이름의 로컬 변수를 만듭니다. 함수 내의 trace 문은 변수의 로컬 값을 출력하지만 함수 외부의 trace 문은 변수의 전역 값을 출력합니다.
var str1:String = "Global";
function scopeTest ()
{
var str1:String = "Local";
trace(str1); // Local
}
scopeTest();
trace(str1); // Global
C++ 및 Java의 변수와는 달리 ActionScript 변수에는 블록 수준 범위가 없습니다. 코드 블록은 여는 중괄호( { )와 닫는 중괄호( } ) 사이의 모든 명령문 그룹입니다. C++ 및 Java 등 일부 프로그래밍 언어에서는 코드 블록 내에 선언된 변수를 해당 코드 블록 밖에서 사용할 수 없습니다. 이 범위 제한을 블록 수준 범위라고 하며 ActionScript에는 이러한 제한이 없습니다. 코드 블록 내에 변수를 선언하면 해당 코드 블록뿐만 아니라 코드 블록이 속한 함수의 다른 모든 부분에서 해당 변수를 사용할 수 있습니다. 예를 들어 다음 함수에는 여러 블록 범위에 정의된 변수가 포함되어 있습니다. 이러한 변수는 모두 함수 전체에서 사용할 수 있습니다.
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"]);
블록 수준 범위가 없다는 것은 함수 정의가 끝나기 전에 변수를 선언하기만 하면 해당 변수가 선언되기 이전에도 변수를 읽거나 변수에 쓸 수 있다는 것을 의미합니다. 이는 컴파일러에서 모든 변수 선언을 함수 맨 위로 이동하는 호이스팅이라는 기술에 의해 가능합니다. 예를 들어 다음 코드에서는 num 변수가 선언되기 전에 첫 번째 trace() 함수를 num 변수에 대해 호출하지만 정상적으로 컴파일됩니다.
trace(num); // NaN
var num:Number = 10;
trace(num); // 10
그러나 컴파일러에서 대입문을 호이스팅하지는 않습니다. 따라서 num에 대한 첫 번째 trace() 호출의 결과가 Number 데이터 유형의 변수에 대한 기본값인 NaN(숫자 아님)이 되는 것입니다. 이는 다음 예제와 같이 변수가 선언되기 전에도 변수에 값을 지정할 수 있다는 것을 의미합니다.
num = 5;
trace(num); // 5
var num:Number = 10;
trace(num); // 10