根据this SO-question中选定的答案,这个非常巧妙的函数创建了一个范围从1到i的数组:

function range1(i){return i?range1(i-1).concat(i):[]}

完美的作品。叫我愚蠢,但我只是无法理解它是如何工作的。假设我们有range1(5)。现在进入函数,我们有了i,因此它返回自身带有参数i-1(4)并向其连接i(5)。但是在这里我被困住了:range1如何知道它与数组有关?我想说的是,在第一次运行后,返回值(只要我们有i,所以i!==0)将是一个数字。而且Number没有concat方法。有人可以解释吗?我想念什么?

最佳答案



不,它不会自动返回。它所做的是调用本身,即递归,然后它返回该调用的结果,并连接最后一个元素。

因此,range1(5)将调用range1(4),这将调用range1(3),依此类推。当它达到零时,它将停止进行调用并仅返回一个空数组。
range1(0)返回[],因此range1(1)返回为[].concat(1)[1],然后range1(2)返回为[1].concat(2)[1,2],依此类推。当我们返回range1(5)
它返回[1,2,3,4].concat(5),它是[1,2,3,4,5]

注意:此函数可以很好地创建较小的数组,但是如果您需要较大的数组,则只需创建该数组并使用常规循环填充它会更快。

关于javascript - 这个用于创建范围的递归函数如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6329420/

10-09 00:59