根据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/