varってなんぞ?
var、僕はある時期まで一度も使った事が無く、ある時期を境に使うようになり、ある時期に今まで動いていたスクリプトが突如動かなくなって使わなくなり、最近ようやくその意味が解ったような気がしている次第です(゜□゜; )
FLASHのヘルプには『ローカル変数を宣言します』とあります。
関数内で変数を宣言した場合、その変数はローカルです。変数はその関数用に定義され、関数呼び出しの終了時にスコープから外れます、なんて事も書いてありますが・・・僕には何の事やらさっぱり解りません。
そ、そもそも『ローカル』ってどこの事ですか?(゜□゜; )
解らない事だらけだったので、更に読み進めていくと、『{}で囲まれた範囲が各々のローカル領域になる』という文章がありました。
つまり、root(まっさらな)状態を一つの『ローカル領域』とすると
//※ローカル領域A var a; function hogehoge(){ //※{}の範囲内なのでローカル領域B var b; } this.onEnterFrame = function(){ //※{}の範囲内なのでローカル領域C var c; }
おそらく、こういう事でしょう(゜□゜)
『ローカル領域Aの中にローカル領域BとCがある』という風に考えてみて下さい。
(※以下、ローカル領域を「領域」と書きます)
まず、{}の隔たりがあるので、領域Aから領域BやCで宣言されたvar変数b,cを参照する事はできません。
また、領域Bから変数c、領域Cから変数bもまた、{}で隔たりがあるので参照はできません。ですが、領域BやCからは変数aを参照する事が出来ます。
これは、領域B,Cが領域A内に作られているため、領域の入れ子になった領域はその外側の領域で宣言された値を参照する事が可能だからでs・・・ん〜、難しすぎるな(゜□゜; )だめだこりゃ(汗
簡単に説明(しようと努力)しますと・・・
「自分の領域から{}括弧の中には入れないが、{}括弧から外に出る事は可能」という事。
あ、そうそう、{}括弧で括られた範囲が誰かの住宅と考えると解りやすいかもしれませんので、以下のように仮定をします。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
領域A(ルートのスクリプトスペース)を『外(郊外)』
領域Bを『B君の家』
領域Cを『C君の家』
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
まず、郊外へは誰もが行く事が出来ます。ですから、郊外にあるもの(変数a)は誰でも見る事が可能です。
B君は、まず、B君の家の中にある物(変数b)は見る事が出来ます。そして更に、家に鍵をかけて外出をすると、郊外にあるもの(変数a)も見る事が出来ますが、他人の家であるC君の家の中の物(変数c)は、見る事ができません。
C君も同様、自宅の物(変数c)と郊外にある物(変数a)は見る事が出来ますが、B君の家の物(変数b)は、見る事が出来ないのです。
■結果 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
領域Aから見る事が可能な変数:a
領域Bから見る事が可能な変数:a,b
領域Cから見る事が可能な変数:a,c
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*
もし、以下のようにスクリプトが組み直された時
//※ローカル領域A var a; function houseB(){ //※{}の範囲内なのでローカル領域B var b; //※領域Bの中に領域Cを作った! this.onEnterFrame = function(){ //※{}の範囲内なのでローカル領域C var c; } }
領域Cは領域Bにある変数も、領域Aにある変数も、見る事が出来るようになります。
例に例えるなら、郊外にあるB君の室内で飼っているペットC猫の寝床、といった所でしょうか(笑
B君は自分の家の中にあるペットCの寝床を見る事が出来そう・・・!(笑)ですが、残念ながら{}括弧があるため、C猫にクリティカルクロウを喰らってしまい、変数cを見る事は出来ないのです。
ルートスペース(領域A)に色々とスクリプトを書き、後にそれらをひとまとめにfunction化させた時などに、ついさっきまで上手く動いていたスクリプトが誤作動を起こした!なんて事はありませんか?
その原因の殆どは、このvarで宣言された変数が{}括弧を隔ててしまったがために変数の取り回しが上手く行かなくなってしまったからでしょう。
スクリプトを{}括弧で覆う時は、一度、使われている変数が他から見る事が出来なくなってしまわないかをチェックする必要があるようです。もしくは、ルートスペース以外でvar宣言をする場合は、その領域でしか使わないものだけにする、といった取り決めをするのが効果的なんだろうなぁ、と思います(゜□゜; )大変です、ハイ。
カテゴリ
なんぞ?トラックバック(0)
このブログ記事を参照しているブログ一覧: varってなんぞ?
このブログ記事に対するトラックバックURL: http://graphicker.jp/flextime/blog/cgi-bin/mt-tb.cgi/89
コメントする