我需要关于在JavaScript中应用方法的帮助

我需要关于在JavaScript中应用方法的帮助,javascript,recursion,methods,apply,Javascript,Recursion,Methods,Apply,作为JavaScript的绝对初学者,我必须选择一些好的源代码来帮助我学习它。我选择了《JavaScript:David Flanagan的权威指南》,到目前为止,我认为这本书中的所有内容都已经被彻底解释过了,但我已经到了我被卡住的地步 这里有个问题,在“函数->参数类型”一章中,有一个函数的例子,它可以添加数字或数组元素。如果此函数可以将其转换为参数数量,则它可以接受任何数字和类型。代码如下所示: function flexisum() { var total = 0; for

作为JavaScript的绝对初学者,我必须选择一些好的源代码来帮助我学习它。我选择了《JavaScript:David Flanagan的权威指南》,到目前为止,我认为这本书中的所有内容都已经被彻底解释过了,但我已经到了我被卡住的地步

这里有个问题,在“函数->参数类型”一章中,有一个函数的例子,它可以添加数字或数组元素。如果此函数可以将其转换为参数数量,则它可以接受任何数字和类型。代码如下所示:

function flexisum() {
    var total = 0;
    for (var i = 0; i < arguments.length; i++) {
        var element = arguments[i], n;
        if (element == null) continue;
        if (isArray(element))
            n = flexisum.apply(this, element);
        else if (typeof n === "function")
            n = Number(element());
        else
            n = Number(element);

        total += n;
    }
    return total;
}
让我困惑的是递归发生的那一行,我不知道n计算的值是什么。例如,如果元素=[1,2,3],则flexisum1,2,3分配给n。。。但是,如果n没有初始值,或者n有初始值,我如何将该值添加到变量total中呢

英语不是我的母语,所以我希望我足够清楚。。。如果有任何帮助,我将不胜感激。

n不需要初始值。当您进行递归调用时,该调用有其自己的所有变量副本。它将total的副本初始化为0,然后循环遍历其参数。在本例中,参数都是数字,因此它将每个参数相加到总数中,得到6。最后,它执行return total;,在原始调用中,这个值被分配给n。这将被添加到其total的副本中

代码中似乎确实有错误。这一行:

else if (typeof n === "function")
应该是:

else if (typeof element === "function")

否则,它将尝试测试未初始化变量n的类型。这允许您提供一个函数作为flexisum的参数,它将调用该函数以获取要添加到sum中的值。

total的初始值为0。或者你的意思是n没有初始值?这并不重要,因为n保证通过else块有一个值。所以,如果我理解的话,当执行isArray条件下的语句时,该条件不再重要,因为参数现在是数字,for语句循环通过它们,所以通过else语句n计算该值并分配给total。我想我现在明白了,非常感谢。似乎我太专注于应用方法,或者有时我很笨|if/then/else if/else的每个分支都处理不同类型的参数,并以适合该类型的方式获取要添加到求和中的值。再次感谢您的帮助和时间。