使用递归JavaScript函数进行同步的优缺点

时间:2014-11-04 22:10:56

标签: javascript recursion

对于同步(序列化执行),我经常在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中使用递归函数进行同步的优缺点是什么?

1 个答案:

答案 0 :(得分:4)

实际递归涉及直接或间接调用自身的函数。这是一个递归函数:

function factorial(n) {
  if (n <= 1) return 1;
  return n * factorial(n - 1);
}

但是,您的代码只是安排系统(有时)在将来某个时间再次调用您的函数。到函数调用发生时,原始函数调用将完成。 (它在设置超时后基本上立即完成。)因此,在任何给定时间,只有一个调用正在进行的函数,因此不会出现堆栈空间不足的问题。