1

这篇文章中,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. 这里的“参数”是 Array 的 slice() 方法的“this”参数,但“slice()”本身需要一个参数,所以我认为你需要做类似Array.prototype.slice.call(arguments, <someIndex>). 我不明白该代码如何按原样工作。

  2. 根据"arguments" 的文档,"arguments" 实际上不是一个数组,而只是一个类似对象的数组。我们如何在上面调用“slice()”?如果我输入代码,console.log(arguments.slice())我会收到一条错误消息,指出该对象没有切片方法。

这里发生了什么?

4

2 回答 2

4

回答第一个问题:

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

回答第二个问题:

我们可以调用 slice,arguments因为它是一个“通用”方法(请参阅此处的注释)。当您将arguments对象作为传递时thisslice会将其视为数组。由于arguments它是一个包含属性的类数组对象length,因此它可以正常工作。

于 2013-03-26T20:59:47.193 回答
3

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

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

于 2013-03-26T20:58:54.280 回答