对于同步(序列化执行),我经常在javascripts中使用递归函数。
有关序列化以下代码执行的示例,
var array = [1,2,3,4,5,6,7,8,9];
//total delay 1s (1s for all)
for (var i=0; i<array.length; i++){
(function(i){
setTimeout(function(){console.log(array[i])},1000);
})(i);
}
我使用这样的递归代码,
var array = [1,2,3,4,5,6,7,8,9];
//total delay 10s (1s for each)
var i = 0;
function fn(){
setTimeout(function(){console.log(array[i])
i++;
if (i<array.length){
fn();
}
},1000);
}
if (array.length > 0){
fn();
}
即使在许多编程语言中,递归函数存在堆栈溢出问题,但除非我们不使用return语句,否则我不会看到这个缺点。
我的问题是,在javascripts中使用递归函数进行同步的优缺点是什么?
答案 0 :(得分:4)
实际递归涉及直接或间接调用自身的函数。这是一个递归函数:
function factorial(n) {
if (n <= 1) return 1;
return n * factorial(n - 1);
}
但是,您的代码只是安排系统(有时)在将来某个时间再次调用您的函数。到函数调用发生时,原始函数调用将完成。 (它在设置超时后基本上立即完成。)因此,在任何给定时间,只有一个调用正在进行的函数,因此不会出现堆栈空间不足的问题。