|
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.
|