我需要帮助来理解未明确指出其与代码其他部分的关系的代码(详细说明发生这种情况的位置和原因的资源将是非常有益的)。很抱歉,我不知道如何更好地引用这种类型的代码,即使它具有特定名称也是如此。
作为示例,我已包含以下代码。 .call(arguments)
未明确引用任何功能。但是,它会导致sumArgumentsCorrectly
使用作为参数传入的数字(1,2,3,4,5)
列表执行(在原始sumArgumentsCorrectly
执行中未给其命名参数)。这对新手来说非常令人困惑,不幸的是,我可以在.call()方法上找到的所有资源都指向.this()的重定向,而没有详细说明如何在不显式命名的情况下调用其自身的函数。
function sumArgumentsCorrectly(){
return [].slice.call(arguments).reduce(function(acc,next){
return acc + next;
},0)
}
console.log(sumArgumentsCorrectly(1,2,3,4,5)) // 15
function sumArgumentsCorrectlyV2(){
return Array.prototype.slice.call(arguments).reduce(function(acc,next){
return acc + next;
},0)
}
function sumArgumentsCorrectlyV3(){
return Array.from(arguments).reduce(function(acc,next){
return acc + next;
},0)
}
console.log(sumArgumentsCorrectlyV2(1,2,3,4,5)) // 15
console.log(sumArgumentsCorrectlyV3(1,2,3,4,5)) // 15
我添加了该代码的两个不同版本。正如@Amy所评论的arguments
不是数组而是类似数组的对象。它具有索引可访问属性和长度属性,并且不具有slice
或reduce
之类的功能。为了执行数组函数,您需要访问该函数并像实例一样传递数组。当您调用call
方法并将arguments
作为参数传递时,您正在告诉编译器在此实例上执行此函数。