Неожиданное поведение при доступе к свойствам переменных скрипта - PullRequest
2 голосов
/ 07 ноября 2011

Я попытался выполнить следующую программу actionscript3, и я удивлен результатом вызова функции f (). Я ожидал, что результат f () будет "1" или, по крайней мере, "неопределенным", но значение "0" не имеет для меня никакого смысла.

Я буду рад получить хорошее объяснение этого поведения, если оно у вас есть, или узнать, считаете ли вы это поведение "нормальным". Я хочу уточнить, что я изучаю поведение программ Action Script, чтобы понять, как на самом деле работает AVM2, и поэтому я не прошу эквивалентный код сделать то же самое. Как следствие, если у вас есть другие хитрые примеры, я также заинтересован.

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 Ответ

1 голос
/ 07 ноября 2011

Ваша переменная x существует в другой области видимости, чем x, который вы возвращаете из S2.f()

S2 extends Sprite, что, в свою очередь, расширяет DisplayObject, который уже имеетсвойство топора.
Это то, что вы возвращаете.

Если вы измените имя переменной на что-то вроде myX, вы получите ожидаемую ошибку.

Это изменит то, что возвращается:

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