# 変数のスコープ

マニュアル > 画面作成ガイド > スクリプト > スクリプトの構文 > # 変数のスコープ |

スコープとは

スコープとは、変数の有効範囲のことを指します。変数の宣言をスクリプト内のどの場所で行うかによって、変数のスコープが決まります。

スコープは大きく分けて、対象の変数がブランケット（“｛”と“｝”）で囲まれた範囲内にあるのか否かによって、スクリプトコードからアクセスできる（スコープ内）、アクセスできない（スコープ外）が異なってきます。

ここで、ブランケット内に定義された変数のことを、「ローカル変数」と呼びます。

また、ブランケットの範囲外、つまり関数やイベントの外側で定義された変数のことを「グローバル変数」と呼びます。

ローカル変数について

ローカル変数とは、イベントやユーザー定義関数内で宣言された変数で、ブランケット（“｛”と“｝”）で囲まれた範囲の中だけで有効な変数です。

下記の場合、変数「a」はOnMouseUpイベントの中で実行され、イベントが終了すると「a」は存在しなくなります。よって、外部オブジェクトから「a」に対して値を設定したり、値を取得したりすることはできません。

    event OnMouseUp(button)
    {
    	var a = "Hello";
    }

下記の場合、変数「b」はif文の中で宣言されています。この場合のスコープはif文の内側のみとなり、if文の外では「b」は存在しません。

従って、たとえ同じイベント内であってもスコープ外では参照エラーとなります。

    event OnMouseUp(button)
    {
    	var a;

    	if (a == 1)
    	{
    		var b = 123;
    		b = b + 1;	//有効
    	}

    	b = b + 5;		//エラー
    }

上記の様に、スコープ内で宣言された変数はスコープ内のみで有効です。また、1つのスコープ内で重複した変数名を宣言することはできません。

| if文に関する詳細は、「条件分岐/繰り返し（ステートメント）」を参照してください。

グローバル変数について

イベントやユーザー定義関数のブランケットの外側で宣言した変数は、グローバル変数となります。グローバル変数は、他のオブジェクトからアクセスすることができる変数です。

例1）Form01のControl1のスクリプトでグローバル変数を宣言した例

    var a = 1;		// グローバル変数の宣言

    event OnMouseUp(button)
    {
    	::OpenMsg(a)	// 1が表示されます
    }

ここで、他のオブジェクトからグローバル変数に対してアクセスするためには、以下のような記述とします。

例2）Form01のControl2のスクリプトから上記例１のグローバル変数にアクセスする場合

    event OnMouseUp(button)
    {
    	parent.Control1.a = 123;	// Control1のグローバル変数aに123を設定
    }

例3）Form01のスクリプトから上記例１のグローバル変数にアクセスする場合

    event OnMouseUp(button)
    {
    	this.Control1.a = 123;
    }

例4）ルートオブジェクトのスクリプトから上記例１のグローバル変数にアクセスする場合

    event OnMouseUp(button)
    {
    	::Form01.Control1.a = 123;
    }

| コントロールやフォームにグローバル変数を宣言する場合、グローバル変数が定義されているフォームやコントロールが閉じられて存在しなくなると、その時点でグローバル変数の値は失われ、再度そのフォームを表示した時には前回の値は失われるという点に注意してください。 フォームの表示・非表示にかかわらず、常に変数に値を保持しておきたい場合には、ルートオブジェクトやバックグラウンドフォームにグローバル変数を宣言するようにします。ルートオブジェクトは、Panel Browserが終了する、あるいは他の設定ファイルを開き直さない限り存在し続けるため、継続して値が保持されます。もしも、Panel Browser終了や他の設定ファイルを開き直した場合についても値を保持しておきたい場合には、Panel Serverのメモリデバイスタグなどを利用して、サーバ側に値を保持するようにしてください。