… (rest) parameter 함수가 쉼표로 구분된 인수를 무제한으로 받도록 지정합니다.
라는 키워드가 있습니다. 위의 설명 처럼 인자의 갯수가 정해져 있지 않을때 사용하며 보통 함수에서 Array 로 반환되어 사용 합니다. 그런데 만약 쉼표로 구분된 인수를 사용하지 않고 바로 Array 를 넣으면 어떻게 될까요?
function myFunction(... rest):void { trace(rest.length + ": " + rest); trace(rest[2]); } var myArray:Array = new Array("this","is","my", "list", "of", "arguments"); myFunction(myArray); /* OUTPUTS: 1: this,is,my,list,of,arguments undefined */
위의 예제 처럼 Array 자체를 인수의 하나로 인식 하기 때문에 그냥 Array 하나 입니다. 하지만 가끔은 꼭 Array 로 인수들을 넘겨 주고 싶을때 가 있습니다. 그런 경우에는 아래의 예제 처럼 apply 로 함수를 실행 시켜주면 되는군요.
function myFunction(... rest):void { trace(rest.length + ": " + rest); trace(rest[2]); } var myArray:Array = new Array("this","is","my", "list", "of", "arguments"); myFunction.apply(this, myArray); /* OUTPUTS: 6: this,is,my,list,of,arguments my */
아래 와 같이 응용 할 수 있습니다.
function callExternalInterface($func:String, $params:Array):void { $params.unshift($func); ExternalInterface.call.apply( $params ); }
출처 : http://blog.mandalatv.net/2009/04/as3-passing-an-array-into-a-function-using-the-rest-parameter/
AS3: Passing an array into a function using the …rest parameter – https://sewonist.com/2011/02/as3-passing-…
하지만 실제 상황은 둘다 보내고 싶을때가 많다는거에요.
인자로 보낸 모든 녀석을 전부 visible false로 해주는 함수가 있다고 해봐요.
visibleFalse( getGroup1(), child1, menuItems )
요개 현실이죠. 배열과 그냥 요소가 같이 날아가요.
따라서 해결방법은 apply가 아니라 arrayStrip을 구현하는거죠.
arrayStrip( [a,4,7], 6 ) = [a,4,7,6]
이 함수를 구현하셔서 rest사용함수 내부에 배치하세요.
function visibleFalse( …param ):void{
param = arrayStrip( param );
…,.
호~ 분명 그런 케이스도 있을 수 있겠군요. 하지만 예와 같이 ExternalInterface.call 처럼 수정 할 수 없는 함수에 대해서는 apply 해야 되지 않을까요?
ㅎㅎ 코드를 잘보세요. rest를 처리하는 이슈와 함수내부의 함수를 apply와 무관해요.
external에 apply하기전에 rest를 strip하는건 무관한 이슈에요.