JavaScriptで、定期的に呼び出される処理を簡単に作る
(function() { alert((new Date()) + '\nfunction is:\n\n' + arguments.callee); setTimeout(arguments.callee, 3000); })();
キモは匿名関数とarguments.callee
ね。
arguments.callee
はその関数自身を表す。こいつをsetTimeout()
に登録してやれば、同じ処理が何度も呼ばれるわけだ。普通にarguments.callee()
で再起にしてもいいけど、それだと無限ループみたいなものなので、まあ扱いにはそこそこ注意が必要。
ちなみにsetInterval()
と違って、処理が終了してから次の処理が呼ばれるまでの間を指定する事になるので、ユーザの入力待ちが発生してもその間に次のタイミングの処理が呼ばれる事はない。
匿名関数は括弧で括って直後に括弧を付ける事で、即実行される。関数リテラルを括る括弧は式を評価するためのもので、その後ろに付けるのは引数をまとめる括弧、という事でそれぞれ括弧の意味は異なっているわけだ。今回の例だと引数とらないからわかりづらいかも。
……以上、なんか書きたくなったので久々に書いてみました。
何かを監視する処理なんかに使えるかもしれない。ただ、ページのロードが完了されてから第一回を呼び出すようにしないと、例えばgetElement*()
はうまくいかない。
あと今調べて知ったんだけど、MDCによるとarguments.callee
は非推奨らしい……。知らなかった。代替は何かあるのかな? そもそも使うなっていう話なのかしらん。
追記(2008/04/18)
なんかカリーだかなんだかわからなくっていうか自信なくなってきたので、「カリー」という表現をやめて素直にarguments.callee
に修正します。ていうか多分間違ってた。