关于Java语言中.call()方法的问题

问题描述 投票:1回答:1

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

作为示例,我已包含以下代码。 .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
javascript methods method-call
1个回答
1
投票

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作为参数传递时,您正在告诉编译器在此实例上执行此函数。

© www.soinside.com 2019 - 2024. All rights reserved.