Why are the MDC prototype functions written this way?
<p>In MDC there are plenty of code snippets that meant to implement support for new ECMAScript standards in browsers that don't support them, such as the <code>Array.prototype.map</code> function:</p>

<pre><code>if (!Array.prototype.map)
{
  Array.prototype.map = function(fun /*, thisp */)
  {
    "use strict";

    if (this === void 0 || this === null)
      throw new TypeError();

    var t = Object(this);
    var len = t.length &gt;&gt;&gt; 0;
    if (typeof fun !== "function")
      throw new TypeError();

    var res = new Array(len);
    var thisp = arguments[1];
    for (var i = 0; i &lt; len; i++)
    {
      if (i in t)
        res[i] = fun.call(thisp, t[i], i, t);
    }

    return res;
  };
}
</code></pre>

<p>What's the benefit (if there's any) of using this function rather than</p>

<pre><code>function(fun, thisp)
{
  // same code, just without the "var thisp = arguments[1];" line:
  "use strict";

  if (this === void 0 || this === null)
    throw new TypeError();

  var t = Object(this);
  var len = t.length &gt;&gt;&gt; 0;
  if (typeof fun !== "function")
    throw new TypeError();

  var res = new Array(len);
  for (var i = 0; i &lt; len; i++)
  {
    if (i in t)
      res[i] = fun.call(thisp, t[i], i, t);
  }

  return res;
}
</code></pre>

<p>, <code>var t = Object(this);</code> rather than <code>var t = this;</code> and <code>var len = t.length &gt;&gt;&gt; 0;</code> rather than <code>var len = t.length;</code>?</p>
