js递归性能影响及解决方案

1、递归为什么耗性能:递归的执行方式是通过前一个执行程序执行完成后返回的值进行下一次执行的,所以最终结果会最后执行,可以理解为先进后出。

   举个例子:function fn(n){if(n==0){return 1} return n * fn(n-1)} 比如说现在需要执行fn(3),那么需要先得到fn(2)的结果,同理要执行fn(2)也要先得到fn(1)结果。可以看到fn被调用了三次。

  浏览器分给程序的执行内存是有限制的,当一个复杂的程序采用递归来执行时,可能会出现栈溢出错误。所以慎用。

2、可以使用迭代的方式替代递归,运行一个循环会比反复调用一个函数的开销低。

3、解决方案:建立一个缓存对象。

function memoize(fn,cache){//fn递归调用的函数,cache缓存对象的预设值
  cache = cache || {};

  var shell = function(arg){

    if(!cache.hasOwnProperty(arg)){//如果缓存数据中没有这个参数对应的值

      cache[arg] = fn(arg);//缓存递归执行结果

    }

    return cache[arg];

  }

  return shell;
}

 

posted @ 2018-10-24 14:34  霜~  阅读(5128)  评论(0编辑  收藏  举报