繁体   English   中英

该功能为什么不起作用?

[英]Why won't the function work?

因此,我正在研究“ JavaScript Allonge”,并提供了此函数来模拟数组的.length函数:

const length = ([first, ...rest]) =>
  first === undefined
    ? 0
    : 1 + length(rest);

现在,如果我将函数重写为:

var lengthy = (first, ...rest) => 
    first === undefined ? 0 : 1 + lengthy(rest)

它给出了Maximum call stack size exceeded ,为什么? 我这样称呼我的版本:

lengthy(1)

您需要在递归调用中使用传播语法,否则您将传递一个数组作为第一个参数,然后其余参数将是一个空数组。 这将持续不断。

这样:

 var lengthy = (first, ...rest) => first === undefined ? 0 : 1 + lengthy(...rest); console.log(lengthy(1,2,3,8,11)); 

请注意,在初始调用时, rest是一个数组,其中包含所有剩余参数。 在上面的示例中, rest将为[2,3,8,11] 这就是其余语法为您执行的操作。

现在,您将看到递归调用的外观,不会再次散布该数组:

 lengthy(rest)

...成为

 lengthy([2,3,8,11]) 

因此,现在递归调用中的参数为:

 first = [2,3,8,11]
 rest = []

如果继续进行此分析,您将看到下一个电话是:

 first = []
 rest = []

这将永远持续下去。

现在,通过改正lengthy(...rest) ,实际的调用将在示例中:

 lengthy(2,3,8,11) 

...这就是你想要的。 现在, firstrest的下一个值将是:

 first = 2
 rest = [3,8,11]

...等等。

答案与解构有关

在原始版本中,您具有:

([first, ...rest])

在第二个答案中,您具有:

(first, ...rest)

原始对象使用单个数组作为参数,并对数组进行解构,以便第一个元素位于first ,其余元素处于rest

第二个数组不会破坏数组,也不会破坏您传入的数组,而rest的则是空数组。 这被递归调用。 在所有对lengthy递归调用中, rest永远不会为空。

var lengthy = ([first, ...rest]) => first === undefined ? 0 : 1 + lengthy(rest)
// lengthy gets passed ONE argument, an array

这很可能是因为first永远不会求值为0,这会导致无限循环。

length接受一个参数,它是一个数组。

lengthy接受任意数量的参数,并对它们进行计数,但是当您递归调用它时,您只会传递一个。

因此,当第二次调用lengthy时, ...restundefined并在递归调用中传递给longy,这意味着从那时起, first将仅是undefined并导致您的错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM