大域変数と局所変数(グローバルオブジェクトとCallオブジェクト)

大域変数と局所変数(グローバルオブジェクトとCallオブジェクト) #

大域変数と局所変数(グローバルオブジェクトとCallオブジェクト)についてを述べる。

グローバルオブジェクトとCallオブジェクト #

Javascriptはスクリプトを読み込んだ時に、グローバルオブジェクトなるものを自動で生成する。グローバルオブジェクトはグローバルスコープを持ったグローバル変数やグローバル関数を管理する。

同様に、関数を呼んだ時にはCallオブジェクトが生成される。Callオブジェクトには関数のスコープ内での変数や関数が管理される。

変数が参照された時、それが関数内でだった場合はその関数に対応したCallオブジェクトから変数を探し、無い場合はその上位のCallオブジェクト(あるいはグローバルオブジェクト)に変数を探していく。

グローバルオブジェクト #

グローバルオブジェクトはブラウザが新しいページを読み込む時に自動で生成されるオブジェクトで、インスタンスの記述は不要である。関数やプロパティを参照する際も、インスタンス名の記述は不要である。

代表的なグローバルオブジェクトは以下の通り。

オブジェクト名 説明
Array 配列オブジェクト
Boolean 真偽値オブジェクト
Date 日付オブジェクト
Error エラーオブジェクト
JSON JSONオブジェクト
Math Mathオブジェクト
Number 数値オブジェクト
Object オブジェクト
String 文字列オブジェクト

グローバル関数 #

グローバル関数はグローバルオブジェクトに含まれる関数である(グローバルオブジェクトそのものでは無い)。グローバル関数はオブジェクトのインスタンス化不要で利用できる。

代表的なグローバル関数は以下の通り。

関数名 説明
decodeURI() URIをデコード
decodeURIComponnent() URIの要素をデコード
encodeURI() URIをエンコード
encodeURIComponent() URIの要素をエンコード
escape() 文字列を16進数文字列を変換
eval() 文字列を評価する(演算)
isFinite() 有限か否かを判定
isNaN() NaN(非数値)か否かを判定する
parseFloat() 文字列を浮動小数点数に変換
parseInt() 文字列を整数に変換

クロージャ #

Javascriptにおけるクロージャとは、関数と変数が一体となったデータ構造である。この構造により、変数の値を保持する処理を簡潔に記述することができる。

関数内の変数は関数の処理が終わると破棄されるが、クロージャではガベージコレクションの対象とならず、変数への参照が残ったままになる。

クロージャの例としては以下の通り。

//クロージャ
function closure() {

    var a=1;

    return function(){
        return a++;
    }
}

var c = closure();

//c()を呼び出すごとにカウントアップ。クロージャなので値が残る
console.log(c())
console.log(c())
console.log(c())

実行結果

1
2
3