함수 범위

함수 범위는 함수를 호출할 수 있는 프로그램의 위치뿐만 아니라 함수가 액세스할 수 있는 정의를 결정합니다. 변수 식별자에 적용되는 동일한 범위 규칙이 함수 식별자에 적용됩니다. 전역 범위에 선언된 함수는 코드 전체에 사용할 수 있습니다. 예를 들어, ActionScript 3.0에는 코드 전체에 사용할 수 있는 isNaN()parseInt() 등의 전역 함수가 포함되어 있습니다. 다른 함수 내에 선언된 중첩 함수는 선언된 함수 내의 어느 곳에서나 사용할 수 있습니다.

세부 목차

범위 체인
함수 클로저

범위 체인

함수가 실행되면 여러 객체와 속성이 만들어집니다. 첫 번째, 매개 변수 및 함수 본문에 선언된 함수 또는 로컬 변수를 저장하는 activation 객체라는 특수 객체가 만들어집니다. activation 객체는 내부 메커니즘이므로 직접 액세스할 수 없습니다. 두 번째, Flash Player에서 식별자 선언을 찾을 때 확인하는 정렬된 객체 목록이 포함되어 있는 범위 체인이 만들어집니다. 실행되는 모든 함수의 내부 속성에 범위 체인이 저장됩니다. 중첩 함수의 범위 체인은 중첩 함수의 activation 객체에서 시작하여 부모 함수의 activation 객체로 이어집니다. 전역 객체에 도달할 때까지 이러한 방식으로 체인이 계속됩니다. ActionScript 프로그램이 시작되고 모든 전역 변수 및 함수가 포함되면 전역 객체가 만들어집니다.

함수 클로저

함수 클로저는 함수의 스냅샷 및 사전적 환경이 포함된 객체입니다. 함수의 사전적 환경에는 함수 범위 체인에 있는 모든 변수, 속성, 메서드 및 객체가 해당 값과 함께 포함됩니다. 함수 클로저는 객체 또는 클래스와는 별도로 함수가 실행될 때 만들어집니다. 자신이 정의된 범위를 유지하는 함수 클로저로 인해 함수가 인수 또는 반환 값으로 다른 범위로 전달될 때 흥미로운 결과가 나타납니다.

예를 들어, 다음 코드에서는 두 개의 함수를 만듭니다. foo()는 사각형 면적을 계산하는 rectArea()라는 중첩된 함수를 반환하고 bar()foo()를 호출하고 반환된 함수 클로저를 myProduct 변수에 저장합니다. bar() 함수에서 로컬 변수 x의 값을 2로 정의하지만 함수 클로저 myProduct()를 호출하면 함수 클로저에서는 foo() 함수에 정의된 변수 x의 값 40이 그대로 유지됩니다. 따라서 bar() 함수에서 8 대신 160을 반환합니다.

function foo():Function
{
    var x:int = 40;
    function rectArea(y:int):int // 함수 클로저 정의됨
    {
        return x * y
    } 
    return rectArea;
}
function bar():void
{
    var x:int = 2;
    var y:int = 4;
    var myProduct:Function = foo();
    trace(myProduct(4)); // 함수 클로저 호출됨
}
bar(); // 160

메서드 역시 자신이 만들어진 사전적 환경에 대한 정보를 유지한다는 점에서 함수 클로저와 유사하게 동작합니다. 이 특성은 인스턴스에서 메서드를 추출하여 바인딩된 메서드가 만들어질 때 가장 잘 나타납니다. 함수 클로저와 바인딩된 메서드 간의 주요 차이점은 바인딩된 메서드에 있는 this 키워드 값은 항상 처음에 연결된 인스턴스를 참조하는 반면 함수 클로저에 있는 this 키워드 값은 변경할 수 있다는 것입니다. 자세한 내용은 바인딩된 메서드를 참조하십시오.


Flash CS3

 

이 페이지에 의견 추가되면 전자 메일 알림 받기 | 의견 보고서

현재 페이지: http://livedocs.adobe.com/flash/9.0_kr/main/00000057.html