calleeの使い道

常に今更な内容ですが、色々コードを読んでいて見つけた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);
}

ただし、もっと本質的には無名関数である必要がありますが・・・

M. K. の紹介

IT屋さんです。プログラミングが大好きで今はJavascriptがお気に入りです。
カテゴリー: JavaScript, tips, プログラミング   パーマリンク