2011-09-27 4 views
1

나는이 있습니다 AS3은 값으로 전달하지 않고 참조로 전달합니까?

for (var i:int = 0; i < 3; i++) { 
    var newChoice:MainButton = new MainButton(function(){ 
    trace(this["func" + i])}); 
} 

public function func0 ... 
public function func1 ... 
public function func2 ... 

그러나

을 (클릭하면 MainButton이 인수에 함수를 호출), 나는 내가 값을 찾아 그것을 할 수 있다고 가정 func3을 얻을. 그러나 그것이 숫자이기 때문에 가치가 지나쳐서는 안됩니다? 원하는 결과를 얻으려면 어떻게해야합니까? 감사합니다

답변

4

(참조로 전달되는) 함수 자체를 제외하고는 아무 것도 전달하지 않습니다.

이 함수는 변수 i 주위에 클로저를 만들어 수명을 변경합니다. 익명 함수가 호출 될 때, i 원래 범위에 여전히 있지만, 루프가 이미 그래서, 폐쇄는 본질적으로도 원래 후 함수의 범위에 i을 유지하고있다 3.

에서 i를 떠나, 완료, 선언 기능이 완료되었습니다.

변수를 닫는 대신 함수를 만들 때 변수 을 닫으려고했습니다. 이 변수는 닫히기 전에 한 번만 설정되는 중간 변수로 얻을 수 있습니다.

for (var i:int = 0; i < 3; i++) { 
    var j = i;  // New variable each time through the loop; closure will close over a different variable each time (that happens to have the same name) 
    var newChoice:MainButton = new MainButton(function(){ 
     trace(this["func" + j])}); 
} 
+0

오, 알 수 있습니다. 어떻게 작동하게하는지에 대한 아이디어가 있습니까? – apscience

+0

@gladoscc : 네, 제 편집을 보아요. (너무 빠르 네요.) :-) – Cameron

+0

가비지 컬렉션에서 클로저가 지옥 같을 수 있습니다. 클로저는 기본적으로 스코프를 잃어버린 객체이며, GC로 인해 시스템이 매우 어렵 기 때문에 괜찮은 해결책과 설명을주는 +1입니다. –

관련 문제