Javascript 中关于 .call() 方法的问题

Question on the .call() Method in Javascript

我需要帮助来理解没有明确指出它与代码其他部分的关系的代码(详细说明发生这种情况的位置和原因的资源将非常有益)。很抱歉,我不知道如何更好地引用这种类型的代码,即使它有一个特定的名称。

例如,我包含了以下代码。 .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 不是数组而是类似对象的数组。它具有索引可访问属性和长度 属性,但没有像 slicereduce 这样的函数。为了执行数组函数,您需要访问函数并像实例一样传递数组。当您调用 call 方法并将 arguments 作为参数传递时,您是在告诉编译器在此实例上执行此函数。