サイトトップ

Director Flash 書籍 業務内容 プロフィール

Macromedia Flash非公式テクニカルノート

ifステートメント内で関数が定義できない

ID: FN0602001 Product: Flash

Platform: Windows
Version: MX, MX 2004 and 8

問題
Flash Player 6以降で、報告された問題です。ifステートメントの中で、関数を定義することができません。以下のスクリプトを実行すると、trace()ステートメントはいずれも「undefined,undefined」を返します(スクリプト001)。

スクリプト001■ifステートメント内で関数が定義できない

// フレームアクション
trace([typeof xTest, xTest()]);   // 出力: undefined,undefined
if (true) {
  function xTest() {
    var s = "called";
    trace(s); // 出力されない
    return s;
  }
}
trace([typeof xTest, xTest()]);   // 出力: undefined,undefined

原因
この問題について明記されたドキュメントは、見当たりません。しかし、かつてMacromediaに問合わせた際には、バグでない(仕様だ)との回答を得ています。ECMA-262にも、この場合の動作について、明確な定めはなさそうです[*1]。

[*1] [Flashcoders]のスレッド「Forward referencing」におけるPeter Hall氏の投稿をご参照ください。

対処法
ifステートメント内でも、名前のない関数でしたら、定義が可能なようです[*2]。ただし、名前のない関数は、定義前に呼出すことができません。

スクリプト002■ifステートメント内で名前のない関数を定義する

// フレームアクション
trace([typeof xTest, xTest()]);   // 出力: undefined,undefined
if (true) {
  xTest = function () {
    var s = "called";
    trace(s);   // 出力: called
    return s;
  };
}
trace([typeof xTest, xTest()]);   // 出力: function,called


[*2] JavaScript(前掲注[*1]参照)やFlash Player 5では、スクリプト001でも関数の定義および呼出しができます。

_____

作成者: 野中文雄
作成日: 2006年2月2日


Copyright © 2001-2006 Fumio Nonaka.  All rights reserved.