JavaScript 第5版 4.6 プロパティと変数は違うのか
オブジェクトのプロパティと変数は同じもの!!
4.6.1 グローバルオブジェクト
-
- JavaScriptインタプリタが起動するとグローバルオブジェクトを生成する。
- グローバルオブジェクトのプロパティがグローバル変数になる。
- グローバル変数を宣言すること=グローバルオブジェクトのプロパティlを定義すること
- グローバルオブジェクトのプロパティ
- Infinityプロパティ:無限大値
- parseIntプロパティ:parseInt()関数
- Mathプロパティ:Mathオブジェクト
- トップレベルコードでは、thisでグローバルオブジェクトを参照できる。
- トップレベルコードとは、関数の一部ではないJavaScriptコード部分のこと。
- 関数内ではthisの意味が異なる。
- クライアントサイドのグローバルオブジェクトはWindowsオブジェクト
- Windowsオブジェクトには自己を参照するwindowプロパティが定義されている。
- thisの代わりにwindowプロパティを使用してグローバルオブジェクトを参照できる
- Windowオブジェクトには、コア言語のプロパティに加えて、navigatorなどのプロパティがある。
なるうほどー。グローバルオブジェクトが存在するのかー。変数を宣言することは、グローバル変数のプロパティを定義することであったとは。びっくりした。
4.6.2 ローカル変数はCallオブジェクトのプロパティ
-
- ローカル変数もあるオブジェクトのプロパティ
- あるオブジェクトとは、Callオブジェクト
- 関数の実行中のみ生存
- 関数ごとに生成
- 関数の引数と変数はCallオブジェクトのプロパティとして格納される
- グローバル変数とローカル変数が異なるオブジェクトを使用することで、名前解決をしている。
Callオブジェクトって、関数内のthisじゃないよな。Callオブジェクト自体にアクセスする方法ってあるのかな? Javaにはない面白さがある。
4.6.3 JavaScriptの実行コンテキスト
-
- 関数を実行するたびに実行コンテキストを生成する。
- 関数外の実行コンテキストでは、変数(グローバル)定義はグローバルオブジェクトを利用
- 関数内の実行コンテキストでは、変数(ローカル)定義はCallオブジェクトを利用
- 複数の「グローバル」実行コンテキストが認められている。
- クライアントサイドJavaScriptでは、フレーム毎にグローバル実行コンテキストが生成される
- 実行コンテキストは、相互に参照可能。
- セキュリティ的に問題はある(13.8節参照)
「コンテキスト」はスクリプト言語のキーワードだよな。Javaメインだったから取っ付きにくかったけど、理解できれば活用方法の想像が膨らむ。