在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)
感到困惑。
这里“arguments”是Array的slice()方法的“this”参数,但是“slice()”本身需要一个参数,所以我认为你需要做{{1}之类的事情。 }。我不明白该代码是如何工作的。
根据the docs on "arguments",“arguments”实际上不是一个Array,而只是一个像object这样的数组。我们如何在其上调用“slice()”?如果我输入代码Array.prototype.slice.call(arguments, <someIndex>)
,我会收到错误消息,说明该对象没有切片方法。
这里发生了什么?
答案 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()
很高兴。