#1です。
>> i=0;
>>
>> とかく場合と、
>>
>> this.onLoad = function hoge(){
>> i = 0;
>> }
>>
>> とかく場合の違いがよくわかりません。
と質問されても,
#1で書いた通り,「前者は正しい書き方,後者は間違った書き方。」
と答えるしかないのですが,本当の質問の意味は何だろうと考え,勝手に推測しました。
『function で i=0; を定義する場合と,function を使わず i=0; の違いは何か。』
というご質問なのでしょうか。
勝手な質問の解釈で,違っている気もしますが,
function を使った場合と使わなかった場合の違いについて書きます。
変数が i 1つだけでは,あまり有り難みがないので,変数は i,j,k の3つであったとします。
また,function も1つだけでは,説明しにくいので hoge1 と hoge2 という2つの function を定義したとします。
また,フレーム数も複数あったとします。
まず,フレーム1のスクリプトです。
------------------------------------
//hoge1関数の定義
function hoge1() {
i = 0;
j = 1;
k = 2;
}
//hoge2関数の定義
function hoge2() {
i = 5;
j = 7;
k = 9;
}
//hoge1関数の実行
this.onLoad = function() {
hoge1();
};
------------------------------------
こう書くと,hoge1 と hoge2 が定義されて,
その後に hoge1 が実行されるので,
変数 i,j,k にはそれぞれ, 値 0,1,2 が入ります。
次に,その後の任意のフレームに
------------------------------------
hoge2();
------------------------------------
と書くと,それだけで hoge2関数が実行されるので,いちいち
------------------------------------
i = 5;
j = 7;
k = 9;
------------------------------------
と書かなくても,変数 i,j,k にはそれぞれ, 値 5,7,9 が入ります。
でもまだ,これだけではまだ有り難みがありません。
しかし,さらにその後の任意のフレームに
------------------------------------
hoge1();
------------------------------------
と書くとそのフレームでまた,
変数 i,j,k にはそれぞれ, 値 0,1,2 が入ります。
こういう風に,何度も同じメソッドや変数への値の代入などが繰り返される場合に function で定義しておくと便利です。
これが,『function で i=0; を定義する場合と,function を使わず i=0; の違いは何か。』
についての説明です。
また,上のように hoge1(); や hoge2(); を書くだけで,それぞれの関数が実行されるなら,
1フレーム目で, this.onLoad = function() を使わずに,
------------------------------------
function hoge1() {
i = 0;
j = 1;
k = 2;
}
function hoge2() {
i = 5;
j = 7;
k = 9;
}
hoge1();
------------------------------------
と書いても同じではないか。違いはどこにあるのか。
と思われるかもしれませんが,
this.onLoad = function() は文字通り,「ロード(表示)されたときに実行」
ということになります。
もし,ムービーが複数フレームあって,またフレーム1に戻ったとき,
------------------------------------
this.onLoad = function() {
hoge1();
};
------------------------------------
と書いてあった場合では,hoge1 は実行されません。
------------------------------------
hoge1();
------------------------------------
だと,フレーム1に戻るたびに何度も実行されます。
フレーム1が最初に表示されたときのみ,hoge1 を実行させたい場合は,
this.onLoad = function() を使って書けば,その意味が出てくるということになります。
あと,this.onLoad = function() はフレーム1に書いたときだけ有効で,フレーム2以降に書いても何も実行されません。
しかし実際は,
_root のタイムラインで this.onLoad = function() を使って書くことはほとんどないと思います。
this.onLoad = function() は,本当は MovieClip.onLoadイベントハンドラメソッド です。
_root だとムービークリップのインスタンス名がありませんから,this という相対パスでメインムービーのことをムービークリップ扱いにして書いているものです。
this.onLoad = function() は _root ではなく,ムービークリップ中のタイムラインの フレーム1 に書くとリンケージから呼び出したときに限って,少しは意味が出てくるのかもしれません。
ムービークリップの onClipEvent()イベントハンドラ の中の1つである onClipEvent (load) のフレーム使用バージョンととらえると良いと思います。
また,ここ↓には
http://www.fumiononaka.com/TechNotes/Flash/FN0503003.html
メインタイムラインの第1フレームで_level0(_root)に設定したMovieClip.onLoadイベントハンドラメソッドは、呼出されるようです。
しかし、ブラウザで確認すると、MozillaベースのブラウザやSafariでは呼出されないという報告がされています(Flash Player 7)。
とも書かれてありますし,なるべく使用しない方が良いと思います。
お礼
ありがとうございます、質問の内容、ご指摘どおりです(苦笑)。 たいへんわかりやすかったです。ありがとうございました。