我需要有关JavaScript中的apply方法的帮助

时间:2014-10-21 20:06:12

标签: javascript recursion methods apply

作为JavaScript的绝对初学者,我必须选择一些好的资源来帮助我学习它。我选择了#14; JavaScript:The Definitive Guide"大卫·弗拉纳根(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] flexisum(1,2,3)被分配给 n ..但是,如果 n 没有初始值,那么如何将该值添加到变量总计,或者是否可以?

英语不是我的母语,所以我希望我足够清楚...我会感激任何帮助。

1 个答案:

答案 0 :(得分:0)

n不需要初始值。进行递归调用时,该调用具有自己的所有变量副本。它将total的副本初始化为0,然后遍历其参数。在这种情况下,参数都是数字,因此它们每个都添加到total,从而产生6。最后,它执行return total;,并在原始调用中将此值分配给n。然后将其添加到total

的副本中

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

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

应该是:

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

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