常に今更な内容ですが、色々コードを読んでいて見つけた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);
}
ただし、もっと本質的には無名関数である必要がありますが・・・