JavaScript の 関数名.caller は微妙だ

function hoge(x, f) {
    if (x === 1) {
        caller = hoge.caller
        hoge(2, function () {
            document.writeln(caller);
            document.writeln(hoge.caller);
        });
    } else {
        f();
    }
}

hoge(1, null);

↓実行結果

null
function hoge(x, f) {
    if (x === 1) {
        caller = hoge.caller;
        hoge(2, function () {document.writeln(caller);document.writeln(hoge.caller);});
    } else {
        f();
    }
}

一見フレームにアクセスできてるように見えるけど、実はグローバルなオブジェクトの属性値が変化している
(追記)arguments.callee.caller でも、arguments.callee が関数名でのアクセスと同じものなのでダメ。arguments.caller がそういう風に使えるものだったようだけど、だいぶ昔に廃止されている