常に今更な内容ですが、色々コードを読んでいて見つけたarguments.calleeの使い方のパターンを書き留めておきます。
非同期の完了待ち
一定の条件が成立するまでタイマーで待機するパターンです。例えばJavascript等の遅延読み込みの完了待ち等です。
setTimeout(function() {
if (完了条件) {
完了時の処理
}
arguments.callee();
}, 15.625);
これなら汎用の関数がかけますね
function wait(condition, callback) {
var _condition = (typeof condition == "string") ?
function() { return eval(condition); } : condition;
if (_condition()) {
callback && callback();
}
setTimeout(function() {
if (_condtion()) {
callback && callback();
}
arguments.callee();
}, 15.625);
}
使い方はこんな感じ
foo.js
FOO = {} FOO.bar = function() { alert("Hellow"); }
JavaScriptの遅延ロード
var s = document.createElement('script'); s.src = "foo.js"; s.type = 'text/javascript'; s.defer = 'defer'; document.getElementsByTagName('head').item(0).appendChild(s); wailt("FOO", function() { FOO.bar(); });
再帰呼び出し
どうもこれが最も典型的な使い方みたいですね。
function Factorials(x) {
if (x <= 1) {
return 1;
}
return x * arguments.callee(x - 1);
}
ただし、もっと本質的には無名関数である必要がありますが・・・