这是教程中的一个函数:
function add() {
var values = Array.prototype.splice.call(arguments, [1]),
total = 0;
for(var value of values) {
total += value;
}
return total;
}
Run Code Online (Sandbox Code Playgroud)
这个表达Array.prototype.splice.call(arguments, [1])让我很困惑.
1?[1]?如果我们传递1,它表示start位置splice(),所以它将跳过我们传递给的第一个参数add(),因此它不会添加所有参数......
这是教程中的错误吗?
是的,这个例子是错的,如果你尝试的代码不起作用(它会忽略第一个参数),就像你说的那样.如果该行是:
var values = Array.prototype.slice.call(arguments),
Run Code Online (Sandbox Code Playgroud)
要么
var values = Array.prototype.splice.call(arguments, 0),
Run Code Online (Sandbox Code Playgroud)
我的猜测:该示例是通过简单地查找另一个函数的代码而创建的,该函数具有一个特殊参数,并且使用它apply而不是call在 ES5 语法中使用。
在本教程的后续部分中,将讨论计算函数,其第一个参数确定要执行的计算类型。如果您使用 ES5 语法编写它们,则必须删除第一个参数。这解释了为什么 1 - 删除第一个参数。现在,为什么要加括号:JS 中有两个几乎相同的函数:call和apply。请参阅此注释apply:
虽然该函数的语法与 call() 几乎相同,但根本区别在于 call() 接受参数列表,而 apply() 接受单个参数数组。
我认为计算函数的作者错误地使用了 for 的语法apply,因此使用了括号。