以下是教程中的函数:
function add() {
var values = Array.prototype.splice.call(arguments, [1]),
total = 0;
for(var value of values) {
total += value;
}
return total;
}
表达式Array.prototype.splice.call(arguments, [1])
让我困惑。
1
? [1]
?如果我们传递1,它代表start
中的splice()
位置,所以它会跳过我们传递给add()
的第一个参数,因此它不会添加所有参数......
这是教程中的错误吗?
答案 0 :(得分:6)
是的,这个例子是错误的,如果你完全按照你说的那样尝试它不起作用的代码(它会忽略第一个参数)。如果该行是:
,代码将有意义var values = Array.prototype.slice.call(arguments),
或者
var values = Array.prototype.splice.call(arguments, 0),
答案 1 :(得分:2)
我的猜测:这个例子是通过简单地编写另一个具有一个特殊参数的函数的代码并在ES5语法中使用apply
而不是call
来完成的。
在本教程的另一部分中,讨论了计算函数,其第一个参数决定了要执行的计算类型。如果使用ES5语法编写它们,则必须删除第一个参数。这解释了为什么1 - 删除第一个参数。现在,为什么括号:JS中有两个几乎相同的函数:call
和apply
。见this note about apply
:
虽然这个函数的语法几乎与call()的语法相同,但最根本的区别是call()接受一个参数列表,而apply()接受一个参数数组。
我认为计算函数的作者错误地使用了apply
的语法,因此使用了括号。
答案 2 :(得分:1)
你是对的,用[1]
调用Array.prototype.splice可能是个错误。
根据splice的MDN文档,此方法的第一个参数应该是一个数字。 Chrome确实会将[1]
解释为1
并跳过第一个参数。
你应该检查是否应该跳过第一个参数,否则最好直接在函数参数上进行for循环。