2011-11-07 3 views
2

다음 actionscript3 프로그램을 실행하려고 시도했는데 f() 함수를 호출 한 결과에 놀랐습니다. 나는 f()의 결과가 "1"이거나 적어도 "정의되지 않았 음"을 기대했지만 "0"값은 나를 이해하지 못합니다.예기치 않은 스크립트 변수의 속성 액세스

나는이 행동에 대한 좋은 설명이 있다면 기뻐할 것이고, 당신이이 행동을 "정상적인"것으로 생각하는지 알게 될 것이다. AVM2가 실제로 작동하는 방식을 이해하기 위해 Action Script 프로그램의 동작을 연구 중이므로 똑같은 코드를 요구하지 않습니다. 결과적으로 당신이 다른 까다로운 예제를 가지고 있다면 나는 또한 관심이있다.

package { 
import flash.display.Sprite; 

    public class S2 extends Sprite { 
     public function f():* { 
      return x; 
     }  
     public static function fs():*{ 
      return x; 
     }  
    } 
} 
var x:int = 1 ; 
var a:S2 = new S2(); 
var g:Function = a.f; 
var gs:Function = S2.fs; 
trace("tracing(g)...:"+g()); //tracing(g)...:0 
trace("tracing(gs)...:"+gs()); //tracing(gs)...:1 

참고 : 나는 다음과 같은 명령 줄이 프로그램을 컴파일 :

mxmlc -debug -static-link-runtime-shared-libraries=true -output S2.swf -- S2.as 

답변

1

귀하의 x 변수가 x 당신이 S2.f()

S2에서 반환하는이 Sprite를 확장 이외의 다른 범위에 존재하는, 이는 다시 ax30 속성을 가진 DisplayObject을 확장합니다.
이것은 귀하가 반환하는 것입니다.

변수 이름을 myX과 같이 변경하면 예상되는 오류가 발생합니다.

때 리턴되는 것을 변경됩니다 이렇게 :

var a:S2 = new S2(); 
a.x = 10; 
trace(a.f()); // will trace 10 
+0

그것은 바로! 감사. 언어 사양을 준수하기위한 유일한 대답 이었지만 너무 단순한 프로그램을위한 수퍼 클래스가 이미 많이 있다는 것을 잊어 버렸습니다. –

+0

또 다른 한가지 : "-debug"옵션없이 컴파일 된 동일한 프로그램은 "스택 언더 플로"오류 (리눅스에서 flex45 sdk 사용)로 연결됩니다. 생성 된 바이트 코드는 정말 이상한 일을합니다 (빈 피연산자 스택의 팝을 포함하여 ...).이 경우 컴파일시에 이미 그런 문제를 만났습니까? –

+0

이것은 비표준적인 방법으로 액션 스크립트 코드를 작성하는 것입니다. 실제로 클래스 선언 다음에 코드로 코드가 작동한다고해도 놀랍습니다. 다른 클래스를 추가하고 그 코드를 생성자에 넣으면 더 운이 좋을 것입니다. – grapefrukt

관련 문제