id:starocker:20060901:p1で紹介されている”たった1行のJavaScriptコードでInternet Explorerをクラッシュさせる方法”で昔同じようにクラッシュしたがことがあったのでそのときのコードのいくつかのサンプル。

紹介されているコード もっと短くなりますね。これ一瞬無限ループ(?-?)みたいに思えてこないでもないけど無限ループではないです。最近のブラウザは無限ループで落ちるようには設計されていないです。 for(w in document.write){ document.write(w); };

これもクラッシュします for(i in document.write); for(i in alert); for(i in print);

検証その1 種あかしはあとでするとしてまず以下のコードを実行してみます。 alert(document.write); // function write(){ [native code] }; alert(alert); // function alert(){ [native code] }; alert(print); // function print(){ [native code] }; 全て[native code]。でも、for(i in String);とやってもIEは落ちない。alert(String); function String(){ [native code] };です。[native code]ですよ?Stringとprintやdocument.writeの違い。加えてArrayも落ちない。

検証その2*1 alert(alert instanceof Function); // IE : false , Firefox : true, Opera : true alert(document.write instanceof Function); // IE : false, Firefox : true, Opera : true alert(typeof(alert)); // IE : object, FirefoxとOpera : function alert(typeof(document.write)); // IE : object, FirefoxとOpera : function というわけで、alertやdocument.writeは、IEでは、型がfunctionじゃなくてobjectになる。 instanceofがFunctionじゃないからそうなるのか？ IEではこれら関数の実装が違うためでJavaScriptからfor(i in 〜)をすると困ったことになるからだろう。

まとめ 以下の条件に該当するものはfor(i in 〜);でIEがクラッシュする。

IEにあらかじめ実装されている関数でinstanceof Functionで true にならないものがそれにあたる。

今わかっていてクラッシュするのは次の3つ。alert, document.write, print。