ActionScriptのスコープをちゃんと理解しよう

下記はウィキペディア(Wikipedia)に「スコープ」についての説明です。

プログラミングでのスコープとは、ある変数や関数が特定の名前で参照される範囲のこと。ある範囲の外に置いた変数等は、通常、その名前だけでは参照できない。このときこれらの変数はスコープ外である、「見えない」といわれる。

スコープの種類について、構文範囲から分類すると、以下のような5種類があります。

大域スコープ (global scope)
    プログラムの「全体」から見えるスコープのこと。このスコープに属する変数は大域変数といわれる。BASICのような単純な言語では大域スコープしか存在しない場合がある。
ファイルスコープ (file scope)
    大域スコープと似ているが、プログラムを記述したファイルの内側でのみ参照できるスコープ。プログラムが複数のファイルから構成される場合は他のファイルから参照することはできない。
ローカルスコープ (local scope)
    ある関数やブロックの範囲内に限定されたスコープのこと。何を持って範囲を与えるかは言語により様々だが、一般に入れ子のローカルスコープは外側を参照できるのが普通である。このとき兄弟関係にあるスコープは見えない。変数宣言が必要な言語の場合は宣言文以降にスコープが制限される場合が多い。Pythonのように外側のスコープがリードオンリーになるケースもある。
インスタンススコープ (instance scope)
    クラスベースのオブジェクト指向言語で、各インスタンス毎に割り当てられた変数が所属メソッド(メンバ関数)からのみ参照されるスコープのこと。いわゆるカプセル化はこれを指す。保護されない変数の場合は、クラス定義が見えていてオブジェクトにアクセスできる場合は直接参照できる。C言語の構造体参照なども一種のインスタンススコープである。
クラススコープ (class scope)
    クラスベースのオブジェクト指向言語で、あるクラスの定義全体から参照できるスコープ。インスタンススコープと異なり変数が共有されるので、ある種の制限された大域スコープと考えることができる。クラススコープをもたない言語の場合でも、ファイルスコープを用いることで同様の機構を実現できる場合がある。ある特定のクラスだけなのか、派生クラスまでも含むのかによってそれぞれクラスインスタンススコープ/クラススコープとさらに細分化する。

スコープ導入から分類すると、以下のような3種類があります。

静的スコープ (static scope)
    構文スコープ (lexical scope)。構文上で決定できるスコープのみを使用する方法。コンパイラ型の言語ではほとんどが静的スコープを採用している。
動的スコープ (dynamic scope)
    静的スコープに加えて、実行時の関数の親子関係で名前を導入するスコープ。関数が呼び出し元で展開されたかのようなスコープが構成される。プログラムの構文的な構造だけからは参照範囲を決定できないため、おおむねインタプリタで使用される。
名前空間 (namespace)
    厳密にいえば名前空間自体はスコープではないが、スコープを導入する機構であるためここに記述する。名前空間はある名前の集合を定義したもので、任意のタイミングで名前空間を導入し、定義された名前を参照可能にすることができる。名前空間では持続範囲を指定できるため、外部で必要のない名前の拡散を避けることもできる。
    名前空間自体も一種のスコープを持ち、名前空間の名前によって参照される。この視点では、上記のファイルスコープやローカルスコープも暗黙の名前空間でスコープを構成していると考えられる。ただし無名であり、外部に導入できない名前空間である。

下記はActionScriptでスコープを表現するソースコードです。

var str1:String = “Global”;
function scopeTest ()
{
var str1:String = “Local”;
trace(str1); // Local
}
scopeTest();
trace(str1); // Global

関数内ではブロックスコープが効かない

function hoge(testArray:Array)
{
var i:int;
var j:int
for (vari:int; i < 10; i++) { // エラー trace(i); } { var j:int // エラー trace(j); }

リソース:
http://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97

Leave a Reply

Your email address will not be published. Required fields are marked *