다시 수년만에 as2의 세계에 입문하게 되어서... as2의 감각을 깨우기 위한 포스팅...



이런 함수가 있다고 쳐보죠...


function a():Void
{
	var obj = {};
	
	Mouse.addListener(obj);
	obj.onMouseDown = function()
	{
		trace("a");
	}
}


뭐, 이것도 나쁘지 않습니다만 다음과 같이 바꿀 수 있습니다


function a():Void
{
	var obj = arguments.callee;
	
	Mouse.addListener(obj);
	obj.onMouseDown = function()
	{
		trace("a");
	}
}


arguments.callee 는 바로 함수객체를 가르키는 포인터입니다. 바로 "a" 라는 함수 말이죠.


이렇게 만들면 오브젝트 "obj"의 생성 비용과 그만큼의 메모리를 절약할 수 있겠지요... 게다가 심지어 a.onMouseDown 으로 접근할 수도 있기에 런타임 상에서 저 이벤트 핸들러를 접근해서 해제할 수도 있고, 다른 함수를 선언할 수도 있습니다.



다른 예도 하나 들어보겠습니다...


var obj = {};
Stage.addListener(obj);
obj.onResize = function()
{
	trace(Stage.width + ":" + Stage.height);
}

이렇게들 많이 짜죠... 레퍼런스에 이렇게 나와있기 때문입니다.


이 코드는 다음과 같이 변경 가능합니다.


Stage.addListener(Stage);
Stage["onResize"] = function()
{
	trace(Stage.width + ":" + this.height);
}


보시다시피 심지어 width 와 height 가 this 로도 접근 가능하지요... 왜냐하면 this 가 바로 Stage 니깐 당연한 얘기입니다.


단, 이 코드를 다음과 같이 안 짠 이유는


Stage.addListener(Stage);
Stage.onResize = function()
{
	trace(Stage.width + ":" + this.height);
}


Stage 가 네이티브 클래스 이다보니 실제 존재하지 않는 onResize 에 접근하면 컴파일시에 에러가 뜨기 때문입니다.

위의 코드와 같이 작성하면 정상 작동합니다.

Posted by 미나토
: