javascript setTimeout递归会造成内存泄漏吗?

function test(){ //这样会不会一直保存上一次的执行环境 var timer = setTimeout(test,1000) } te…
关注者
22
被浏览
51,203

4 个回答

会,当setTimeout里面的函数,接收外边大函数里面的参数,内层函数私有作用域就不会销毁。


内存泄漏的原因(原因很多,这里说两种解决这个问题需要的):

1.在函数里面定义全局变量,导致执行环境无法清除

2.对闭包的使用导致无法清除

单单对于setTimeout( )函数,如果第一个参数为字符串,则会引起内存泄漏,因此要尽量避免,是函数不会引起内存泄漏

//会导致内存溢出的
var n=0;
var timer = null;  
function move(){
    console.log(n);
    if(n === 5){
       return;
  timer = setTimeout(move,1000);  //timer是一个全局变量,move每次的执行环境都不会被回收
    move();

改进

//方法1
var n=0;
var timer = null;  //如果定义在全局一直不销毁timer
function move(){
    window.clearTimeout(timer);  每次都先清除timer
    console.log(n);
    if(n === 5){
       return;
  timer = setTimeout(move,1000);
    move();

方法2

var n=0;
function move(){
    console.log(n);
    if(n === 5){
       return;
   var timer = setTimeout(move,1000);每次执行都会销毁