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 を覚えておくコストは気にしないよ
ん〜 こんなもんかなぁ…
間違いがありましたら、ぜひ教えてください。