大域変数と局所変数(グローバルオブジェクトと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