SSブログ

global object と call object [JavaScript]

JavaScript のグローバル変数はすべて global object と呼ばれるオブジェクトのプロパティである。global object への参照は this を使って得られる。これは Lua のグローバル変数が _G というテーブルの要素であるというのに似ている。ただし Lua では _G 自体がグローバル変数であり、従って _G 自身の要素であるのに対して JavaScript では this は this のプロパティではない。

> -- Lua
> i = "global i"
> print(i)
global i
> print(_G.i)
global i
> print(_G._G.i)
global i
> print(_G._G._G.i)
global i
js> // JavaScript
js> i = "global i"
global i
js> print(i)
global i
js> print(this.i)
global i
js> print(this.this.i)
4: SyntaxError: missing name after . operator:
4: print(this.this.i)
4: ...........^
js>

JavaScript 本ではグローバル変数が global object のプロパティであるのと同様にローカル変数も call object と呼ばれるオブジェクトのプロパティなのですよと説明している。Lua には同様の概念はない。この説明には特にコード例のようなものがなかったのだが、疑問に思ったのはその call object への参照はどのようにして得られるのかということだ。global object とのアナロジーで考えれば関数の中での this が call object を指していると期待できるのだが、実際試してみるとそうではない。(以下のコードはさっきの続きで打ち込む)

js> function f() {
        var i = "local i";
        print(i);
        print(this.i);
}
js> f()
local i
global i

この例から分かることは関数の中であっても this は global object を指し示すということだ。しかし call object への参照を得る方法がないとしたら、そもそも「ローカル変数は call object のプロパティである」という言明はどういう意味をもつのだろうか。

(1) 実装上ローカル変数を格納するオブジェクトを作っている場合が殆どですよという意味
(2) call object というものがあると考えると学習上分かりやすいですよという意味
(3) call object というものがあると考えると global object とパラレルになって概念的に美しいですよという意味

勿論まだ JavaScript は始めたばかりなので、ひょっとしたら call object の実体を通常のプログラミングレベルで観察できる方法があるのかもしれない。

ちなみに Lua では debug.getlocal という関数でローカル変数の情報を得ることができる。

> function f(x, y)
>>   local z
>>   local i = 1
>>   while true do
>>     local n, v = debug.getlocal(1, i)
>>     if not n then break end
>>     print(n, v)
>>     i = i + 1
>>   end
>> end
> f(777, 999)
x       777
y       999
z       nil
i       4

こちらではテーブル(オブジェクト)との類似性はまったくない。


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

Tcl 8.5 の {expand}Lisp の special forms ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。