(続)javascriptでArrayにeach()を実装する - あおうさ@日記

ありがたいことにid:ZIGOROuさんから情報を頂いた。

Fx だと forEach, map とか揃ってますね。
https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Array#Iteration_methods

 
javascript1.6だとArrayにforEachという関数が追加されるようだ。
実装は下記でほとんど似たような実装だった。

Array.prototype.forEach = function(fun /*, thisp*/)
{
  var len = this.length;
  if (typeof fun != "function")
    throw new TypeError();
  var thisp = arguments[1];
  for (var i = 0; i < len; i++)
  {
    if (i in this)
      fun.call(thisp, this[i], i, this);
  }
};

読んでみると下記の部分がよくわからなかった。引数があった場合はそのオブジェクトにしたいってことは
わかったのだがなぜ引数無しで動作するのかがわからない。

var thisp = arguments[1];

試しに実行してみると

function printElt(element, index, array) {
    alert(this); // x
}
[2, 5, 9].forEach(printElt, ["x"]);

だよね。

function printElt(element, index, array) {
    alert(this); // [object Window]
}
[2, 5, 9].forEach(printElt);

firefoxでやるとWindowなんだ。よくわからんけどそういう動きらしい。