すがブロ

sugamasaoのhatenablogだよ

JavaScript高速化

IEの高速化テクニック

IT戦記 - 一行で IE の JavaScript を高速化する方法
ようするに、document オブジェクトを変数に置いておくと早くなるよっていう話なんだけど、どうにもここが理解できない(納得できないではなくて、本当に理解できない)。

var doc = document;
var document = doc;

のようなことを出来れば一番いいのですが。。。

これもまた、 JavaScript では変数はスコープの先頭で生成されるため、 document は空の変数となり undefined になってしまいます。

自分でも試してみたけど、 undefined になってしまう。
実験には、普通の HTML 構造と、 HEAD タグ内で script タグを使って JS を記載してみた。

var doc = document

alert で確認してみたけど、この時点では doc も document も object と表示される。

var doc = document
var doucment = doc

こうすると、 doucment も doc も undefined になってしまう。
何故だろう。2行目の時点での doc が undefined になっているのか? ……よくわからん(´Д`)
JSのスコープの概念がわかってないから理解できていないのだろーか。

コメント欄が人気のようなので

見やすいように本文へ移動しておく。
とおりすがり氏曰く:

> これもまた、 JavaScript では変数はスコープの先頭で生成されるため、 document は空の変数となり undefined になってしまいます。

例えば var foo = 1, bar = 2; var foobar = foo + bar; なんていう宣言があった場合、
var foo = bar = foobar = undefined; //宣言された変数はスコープの最初に全部まとめて生成される。
foo = 1; bar = 2; foobar = foo + bar;
みたいに解釈されます。なので
var doc = document; var document = doc; は
var doc = document = undefined; doc = document; document = doc;
になって undefined になるんですよ。

> 2行目の時点での doc が undefined になっているのか?

var document; がある時点で、そのスコープに入った瞬間に document が undefined になるわけです。
と、全然関係ない通りすがりでした。

低脳なおれでもよくわかりました。ありがとうございます!