3

我找到了这段代码,但我不明白参数中注释块的目的:

if (!Array.prototype.some)
{
  Array.prototype.some = 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))
        return true;
    }

    return false;
  };
}

在我看来,它可能是正常的第二个参数,然后可以删除该行:

var thisp = arguments[1];
4

3 回答 3

1

如果Array.prototype.some已定义,则原始方法有第二个参数,即thisp,但由于未定义,作者定义了他/她自己的模仿功能的方法。

作者期望调用者传递的第二个参数是thisp. HTH。

于 2012-04-29T20:03:10.200 回答
1

Array.prototype.someFirefox 内置的实现的元数为 1,即它接受一个参数。为了在不更改元数的情况下实现第二个可选参数,替换代码arguments[1]改为通过访问第二个参数。

我实际上不知道 EcmaScript 规范对Array.prototype.some.

于 2012-04-29T20:12:38.010 回答
0

你是对的,它应该是一个参数,因为 1. 在函数arguments中使用函数是昂贵的,并且 2. 它是硬连线到函数中的,尽管它可以留undefined在实际的循环中。我会说,该方法不应该在生产代码中。再测试一些,目前尚不清楚第二个参数实际上做了什么。MDN 垫片是一只奇怪的鸭子,但也许我错过了一些东西。

于 2012-04-29T20:16:13.370 回答