重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

ActionScriptバイブルという本を読みながら勉強をしているのですが、
その本の中で、構文の書き方に "}"と"};" があります。
セミコロンがついてなくても今のところは動いてくれます。
どういう違いがあるのでしょうか?

A 回答 (3件)

ActionScript での” ; ”と” } ”は、一言で言うと文の区切りとしての記号です。



文とは、ここでは1つ1つの命令のことと思ってください。ヘルプでは”ステートメント”と書かれています。
日本語の文法にも句読点があり、句点(”。”)までを1つの文として解釈するように、ActionScript でも、どこまでを1つの命令として解釈するのか、区切りを付けるためのルールが用意されています。
その区切りの記号として採用されたのが” ; ”と” { } ”です。
文の区切りは、文の数だけ用意しなければなりません。


” } ”は必ず” { ”とペアで使い、{ } で囲まれた部分が1つのかたまりとして解釈されます。

” ; ”も文の区切りとしての役割を持っていますが、” ; ”の前に何も命令がなくても、れっきとした1つの文と見なされます。
例えば

 for( i = 0 ; i < 10000 ; i++ )
  ;

↑こんな使い方も、文法上は間違いではありません。
for( … ) に続く単独の” ; ”は、「何もしない」という意味の文になります。

ちなみに、何もしない文のことを”空文”といいます。
この例は深い意味のない空文の例ですが、何もしない文でありながら意味を持つ用法もあります。

***********************

さて、if 文は

 if( 条件 )
 {
  /*ここに処理を書く*/
 }

このように、if に続けて { } を置く書き方が通例です。

では、

 if( 条件 )
 {
  /*何かの処理*/
 };

↑というように、” } ”の次に” ; ”を付けたら、どうでしょうか?


これも先の for ループの例と同様に、実はエラーにはなりません。
if のすぐ下に続く { } までが if の制御対象であり、そのすぐ隣の” ; ”は「空文=何もしない」と解釈されます。
つまり、このスクリプトは

 ・ if の条件が成立していたら、{ } 内のスクリプトを実行
 ・” ; ”=何もしない、というスクリプトを実行

との意味になります。

文法上は確かに間違いではないのですが、特に意味がない” ; ”ならわざわざ付ける必要はありませんよね。
ですから、if や for では、複数の処理を制御したい場合は { } の中にまとめるだけで、その先に” ; ”を付けない書き方が一般的です。
switch ・ while など、他の制御文でも同様です。


関数を定義する場合も同じです。

 function Test()
 {
  a = 1;
 };

これもエラーにはなりませんが、” ; ”はただ余計なものでしかありません。

-------------------------------------------------------------

Flash の参考書でも著者によって書き方が分かれるのが、

 this.onEnterFrame = function()
 {
  ・・・
 };

↑このように、匿名の関数を定義して変数に代入する類のスクリプトの書き方だと思います。


このスクリプトは何をしているのかというと、名前を付けない関数(匿名関数といいます)を定義して、できた関数の参照と呼ばれる値を onEnterFrame に代入しています。

function() に続く { } が「 { } の中が、関数の内容です」との意味であり、” } ”が既に文の区切りとしての役割を果たしています。
しかし、このスクリプトは「参照を代入する式」という文でもあります。
つまり、function に対する文の区切りは { } の” } ”ですが、「 onEnterFrame に参照を代入する文」に対しての区切りが” ; ”になります。

なお、ActionScript では改行も文の区切りと見なしてくれます。
” }; ”とする代わりに改行を入れておけば、” ; ”がなくても文法的には間違いではありません。
この例で最後の” ; ”があってもなくても問題がないのは、改行も文の区切りになるという文法のおかげです。

-------------------------------------------------------------

ActionScript 2.0 までの ActionScript では、ムービークリップとボタンのインスタンスにスクリプトを書くことができます。
ムービークリップ・ボタンのインスタンスに書くスクリプトは、on または onClipEvent という制御文の管理下に書かなければならない決まりがあります。

とすると、

(↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください)

 on(release)
 {
  trace( "Call" );
 };

この例は、文法的に○か×か、どちらでしょうか?


やってみると分かりますが、これはエラーになります。
” ; ”だけ書くと、何も仕事をしないけれど、ちゃんとした1つの文です。
そして、on または onClipEvent が制御するのは、すぐ下の { } の中1つだけです。
従って上記のスクリプトは、単独の” ; ”=空文が on の管理下から外れているため、「 on ・ onClipEvent の管理下に置かなければならない」という文法に違反していることになるのです。

-------------------------------------------------------------

文法上は間違いではないけれど、常識的に言って普通はやらない、という書き方もあります。

例えば

 a = 1

 if( a )
 {
  trace( a );
 } b = 2;

↑こんな書き方をしても、文法上は間違いではありません。

a = 1 の後ろに” ; ”が抜けていますが、改行が入っているのでここまでが1つの文と見なされます。
if( a ) は” } ”までなので、b = 2; は1つの独立した文になります。


まあ、確かに間違いではないしスクリプトも動きますが、見辛く分かりにくい書き方です。
動くからいい・文法上間違いじゃないからいい、で済まさず、後々の保守や他の人が見る場合も考えて、なるべく見やすいレイアウトや書き方をするようにしましょう。
特に改行を文の区切りとする書き方は、ActionScript ではあまり一般的ではないと思います。

レイアウトに関しては人それぞれ主義や好みがあります。
本や解説サイトに載っているレイアウトだけが正解ではなく、いろいろなスタイルがあります。
自分に合った書き方を研究してみてください。
    • good
    • 0

よくよく観察すれば違いがわかると思います。


無名のfunction(匿名関数 とも言う)の後の } は }; にすべきです。
普通の名前付き function や on(○○){△△} の後の } は }; にすべきではありません。


◎ } にすべき例

on(release){
 // ここにステートメント
}

function myFunc(){
 // ここにステートメント
}


◎ }; にすべき例

_root.onEnterFrame = function{
 // ここにステートメント
};


簡単には,#1 の方もかかれていらっしゃるように,「自動フォーマット」を使えば良いです。それに越したことはないと思います。
    • good
    • 0

どちらでも問題ありません。


両方の方法を混同して入力しても、スクリプトの所の「自動フォーマット」をすればセミコロン(};)の形になります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!