【问题标题】:I need help about apply method in JavaScript我需要有关 JavaScript 中应用方法的帮助
【发布时间】:2014-10-21 20:06:12
【问题描述】:

作为 JavaScript 的绝对初学者,我必须选择一些好的资源来帮助我学习它。我选择了 David Flanagan 的“JavaScript: The Definitive Guide”,到目前为止,我认为这本书中的所有内容都得到了彻底的解释,但我遇到了困难……

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

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 评估的值是什么。例如,如果 element = [1,2,3],则 flexisum(1,2,3) 被分配给 n.. . 但是,如果 n 没有初始值,我该如何将该值添加到变量 total 中,或者有吗?

英语不是我的母语,所以我希望我说得够清楚......我将不胜感激。

【问题讨论】:

  • total 的初始值为 0。还是您的意思是n 没有初始值?这没关系,因为n 保证通过else 块有一个值。

标签: javascript recursion methods apply


【解决方案1】:

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

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

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

应该是:

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

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

【讨论】:

  • 所以,如果我理解它,当执行 isArray 条件下的语句时,该条件不再重要,因为参数现在是数字和 for 语句循环遍历它们,因此通过 else 语句 n 评估该值并分配给 total。我想我现在明白了,非常感谢。似乎我过于关注 apply 方法,或者我有时很笨。 :|
  • if/then/else if/else 的每个分支处理不同类型的参数,并以适合该类型的方式获取要添加到总和的值。
  • 好吧,看来我需要用递归来练习更多的例子。再次感谢您的帮助和时间。
猜你喜欢
  • 2021-08-15
  • 1970-01-01
  • 2012-07-27
  • 2021-12-09
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
  • 2015-08-29
  • 1970-01-01
相关资源
最近更新 更多