test.html
久しぶりにWindowsのPCを開いたら、test.html というのがあって、中身を確認してみようと思ったら、ブラウザが固まりましたw
腹が立ったので、ファイルの中身を日記に書きます。ちなみに、このファイルを書いたのはもちろん自分自身です。
<script langage='javascript'> var x = function(y){ return function(z){ document.write('test<br />'); return y(z); }; }; while(true){ x = x(x); } </script>
原文ママです。タイポやツッコミどころがある気がしますが、そっとしておいてください。langageじゃなくてlanguageだろとか、htmlのタグはダブルクォーテーションだよねとか、そういうツッコミは不要です。
追記
シングルクォーテーションでもいいらしい。突っ込まれた…
スクリプト解説
このスクリプトを書いたのは、これをやりたかったからだと思います。↓
x = x(x);
「JavaScriptって、関数を渡して関数を返す関数が書けるのか。すごーい!」というノリで書きました。
ちなみに最初のxについて説明すると、xに引数をひとつ取る関数yを渡すと、引数をひとつとって、その値をyに与えて実行する関数が返ってきます。つまり、xに関数yを渡すと、yを実行する関数が返ってきます。
xを簡潔にいうなら、「引数として受け取った関数を実行する関数を返す関数」です。
だから、xにxを渡すと、「『引数として受け取った関数を実行する関数を返す関数』を実行する関数」が返ってきます。これをxに代入しています。
そして、どさくさに紛れて「test<br />」も出力しています。
ちなみに、2週目は、「『引数として受け取った関数を実行する関数を返す関数』を実行する関数」を実行して、その引数に、「『引数として受け取った関数を実行する関数を返す関数』を実行する関数」を渡しています。すると、「引数として受け取った関数を実行する関数を返す関数」が実行されて、その引数は「『引数として受け取った関数を実行する関数を返す関数』を実行する関数」になります。そのため「『「引数として受け取った関数を実行する関数を返す関数」を実行する関数』を実行する関数」が返ってきます。
整理してみると分かりやすいですね*1。
しかし、このプログラムを書いた人が、ここまで理解して書いていたとは思えません。
最後に補足
ちなみに、このプログラムが止まらないのは、上のトリックは全く関係なく、ただのwhile(true)による無限ループです。
*1:だけど、私にはよくわかりません >