困惑关于Resig Curry示例和“arguments”对象

时间:2013-03-26 20:55:34

标签: javascript

this article中,John Resig讨论了这个用于讨论的片段:

Function.prototype.curry = function() {
    var fn = this, args = Array.prototype.slice.call(arguments);
    return function() {
      return fn.apply(this, args.concat(
        Array.prototype.slice.call(arguments)));
    };
  };

我对表达式Array.prototype.slice.call(arguments)感到困惑。

  1. 这里“arguments”是Array的slice()方法的“this”参数,但是“slice()”本身需要一个参数,所以我认为你需要做{{1}之类的事情。 }。我不明白该代码是如何工作的。

  2. 根据the docs on "arguments",“arguments”实际上不是一个Array,而只是一个像object这样的数组。我们如何在其上调用“slice()”?如果我输入代码Array.prototype.slice.call(arguments, <someIndex>),我会收到错误消息,说明该对象没有切片方法。

  3. 这里发生了什么?

2 个答案:

答案 0 :(得分:4)

回答第一个问题:

如果在没有参数的数组上调用slice,它将只返回数组的副本。 Array.prototype.slice.call(arguments)执行相同的操作,但对arguments对象进行操作,返回一个数组。

回答第二个问题:

我们可以在arguments上调用切片,因为它是一种“通用”方法(请参阅注释here)。当您将arguments对象作为this传递时,slice会将其视为数组。由于arguments是包含length属性的array-like object,因此它才有用。

答案 1 :(得分:3)

.slice()的参数是可选的。如果它不存在,该函数只返回原始数组(或类数组对象)的副本。

.slice()函数只关心this对象上是否存在“length”属性。因此,因为“参数”确实具有“长度”属性,.slice()很高兴。