IE9でもjavascriptを2倍速くするコード | blog lab 【アメブロカスタマイズとネタ話】

blog lab 【アメブロカスタマイズとネタ話】

コメント欄にプロフィール画像、などのカスタマイズの小ネタと、普段の話のネタを書いていきます。

有名なuupaaさんのブログで、IE9RCでdocumentがconstになり再定義が不可能になったという記事を読みました。
この記事の意味するところは2つあります。

1…IEがconst(定数のこと)を実装した。

実はFirefoxでは以前から実装済みだったんですが、その他の言語と違い「varよりconstの方が速い」というわけじゃないので、ふ~んっていう感じです(無いだろうけど、IEのconstは速い、とかならすんませんw)。
で、二つ目が問題。

2…amachangさんのIE高速化の方法が使えない。

天才スクリプターamachangさんの考案したこの方法はIE7を5倍速く、IE8でも2倍は速くするという現役バリバリの優れモノ。
しかしdocumentがvarからconstになっちゃったので、グローバルでの再定義ができなくなっちゃったのでした・・・。
つまり、グローバルスコープではvar document = hogehoge;というようにdocumentに何かを代入することができなくなったというわけです。

実はjQueryでも同じような方法を使っているのですが、問題無く動作しています。

jQueryはコード全体を即時関数でラップしているので、コード全体がローカルスコープなんですね。
なので、var documentを即時関数内のスコープで宣言すれば問題ないというわけです。
バージョン1.5のソースコードの2行目に記述されています。

var document = window.document;

javascriptではグローバルスコープにいろいろ書くのは良くないことなので、コード全体を即時関数でラップするのが通例のようになっていますが、こういう局面でもその手法が役に立ちますね!

つまり・・・

(function(){
var document = window.document;
//ここにコードを書いていく
}());

このように書けば今まで通り高速化できます。
ちなみに・・・

IEで、と書きましたが、グローバルスコープでこれを実行する場合、IE以外は全然速くなりません(かえって遅くなることもあるかも)。
即時関数でラップしたローカルスコープ内ならIE以外も多少(わずかですが)恩恵を受けることになるかと思います。
なので「IEのみに適用する記述」はこの場合必要ないかと思われます。


記事の話題関連のツイート on twitter