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:だけど、私にはよくわかりません >