イリュージョン − 消えるif条件ブロック内の関数 [Edit]

少々マニアックな現象です。if条件のステートメントブロック{}内に設定した関数(function)が、こつ然と消えてなくなります。

Flash MX 2004または8(Flash Player 6以降書出し)で、つぎのスクリプト001を試してみましょう。

スクリプト001■functionを定義した場合

if (true) {
  function test():Void {
    trace("called");
  }
}
test();   // 無反応
trace(test);   // 出力: undefned

なぜかfunctionが、定義されません。ですから、当然呼出すこともできません。ところが、名前のない関数で定義すると、呼出せるようになります。

スクリプト002■名前のない関数を定義した場合

if (true) {
  var test:Function = function ():Void {
    trace("called");
  };
}
test(); // 出力: called
trace(test); // 出力: [type Function]

スクリプト001は、ActionScript 3.0またはFlash Player 5で書出すと、たちまち動作します[*1]。もっとも、このような処理が必要になることは、滅多にないとは思います。


[*1] ActionScript 3.0では、functionの戻り値はVoidでなくvoidにします。また、Flash Player 5の場合は、型指定はすべて削除する必要があります。

コメント

この記事へのコメント

  1. 1.torio(2007年01月29日 13:20)

    ActionScriptで無名関数を使う場合はスコープを限定する癖をつけておいた方がいいかもしれません。
    たとえば、
    if (true) {
    var test:Function = function ():String {
    return "called";
    };
    trace("end");
    }
    とすると、最後のtrace("end")は実行されません。そこで無名関数を括って、
    var test:Function = (
    function ():String {
    return "called";
    }
    )();
    とするとreturnを使ってもifブロックを抜けません。

  2. 2.野中 文雄(2007年01月29日 16:33)

    私の環境(Flash 8/Mac OS X.4.8)では、前者のtrace()アクションは問題なく実行されます。

    後者は、変数testに関数の戻り値を代入する処理になり、本来型不一致(FunctionにStringを代入)のエラーになるはずです。ただし、名前のない関数を定義すると同時に呼出すことがなぜかできないので、変数testにはundefinedが格納されます。

    参考:「名前のない関数を定義と同時に呼出す」
    http://f-site.org/articles/2004/08/23074843.html

この記事にコメントを書く

記事に対するテクニカルな質問はご遠慮ください(利用規約)。

その他の記事