ECMAScript5でargumentsがArgumentsオブジェクトになる(らしい)

@taku_eof さんのご指摘を受けて、タイトルを「ECMAScript5でargumentsが配列になる」から「ECMAScript5でargumentsがArgumentsオブジェクトになる(らしい)」に変更。
(らしい) としているのは、また変化するかもしれないから。

ECMAScript5 で arguments が配列そのものになるらしい。この話そのものはずっと前から出てたけど、arguments.callee の扱いがハッキリしてなくて、arguments.callee 使えなくなるのかな? とかちょっとドキドキしてた(時もある)。
ECMAScript5 で arguments が Arguments オブジェクトになるらしい。ただ、arguments.callee の扱いがハッキリしてなくて、arguments.callee 使えなくなるのかな? とかちょっとドキドキしてた(時もある)。

現行のブラウザだと arguments は Array に似た別のものとして実装されていて(特にOpera)、特別な振る舞いを持っていた。

  • arguments.callee には関数自身の情報が格納されている
  • arguments.caller には呼び出し元の情報が格納されている(実装もある)
  • function hoge(A) {} の中では、arguments[0] === A だった
function hoge(A, B) {
  arguments[0] = arguments[0] * arguments[1];
  window.status = A; // 8 がステータスバーに表示される (8 = 2 * 4)
}
hoge(2, 4);

ECMAScript5 でも arguments.callee は使えるみたい。
ただし、Array に Hash を突っ込む形らしい。擬似コードだとこんな感じになるのかな。
この辺は修正してません。

function hoge(A, B) {
// hoge() 初期化擬似コード
  var arguments = [];
  arguments[0] = 引数Aの値のコピー(または参照)が格納される
  arguments[1] = 引数Bの値のコピー(または参照)が格納される
  arguments.callee = hoge; // 自分自身のFunctionオブジェクト
  ;
  ;
}

実は arguments.callee って無くても困らないんじゃ?

以下のコード(改行抜きで78文字)は

(function() {
  window.status += ".";
  setTimeout(arguments.callee, 1000);
})();

ちょっと短く(65文字)できたり、

(function F() {
  window.status += ".";
  setTimeout(F, 1000);
})();

変形(71文字)できる

var F = function() {
  window.status += ".";
  setTimeout(F, 1000);
};
F();

イベントハンドラの解除で、 arguments.callee が役立つこともあるけど(146文字)、

window.addEventListener("load", function(evt) {
  window.status = "loaded";
  window.removeEventListener("load", arguments.callee, false);
}, false);

使わなくても良かったりする(141文字)

var F = function(evt) {
  window.status = "loaded";
  window.removeEventListener("load", F, false);
};
window.addEventListener("load", F, false);

# ガベージが F を覚えておくコストは気にしないよ


ん〜 こんなもんかなぁ…

間違いがありましたら、ぜひ教えてください。